Spring Study -lesson11-动态代理扩展-2023-03-18

一个动态代理接口类,可以作为工具接口,便于不同程序公共使用

package com.feijian.Demo02;

import com.feijian.Demo.Rent;
import com.sun.corba.se.impl.ior.OldJIDLObjectKeyTemplate;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//用这个类自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {

    //1、代理谁? 被代理的接口
    private Object target;
    public void setTarget(Object target) {
        this.target = target;
    }

    //2、生成得到代理类
    public Object getProxy(){
      return  Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this );
    }

    @Override
    //3、处理代理实例,调用代理的执行方法
    //动态代理的本质就是用反射机制
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        log(method.getName());
        Object result = method.invoke(target, args);
        return result;
    }

    public void log(String msg){
        System.out.println("执行了"+msg+"方法");
    }
}

测试:两个不同的业务,一个租房 一个增删改查

package com.feijian.Demo02;

import com.feijian.Demo.Host;
import com.feijian.Demo.Rent;
import com.feijian.Service.UserService;
import com.feijian.Service.UserServiceImpl;

import java.lang.reflect.InvocationHandler;

public class Client {
    public static void main(String[] args) {
        //1、真实角色
        UserServiceImpl userService = new UserServiceImpl();
        //2、代理角色,不存在
        ProxyInvocationHandler pih = new ProxyInvocationHandler();
        //3、设置要代理的对象  (set方法)
        pih.setTarget(userService);
        //4、动态生成代理类
        UserService proxy1 = (UserService) pih.getProxy();
        //5、代理执行不同的方法
        proxy1.insertUser();

        System.out.println("====================================================");
        //1、真实角色
        Host host = new Host();
        //2.代理角色(上已生成)
        //pih生成
        //3.设置代理的对象
        pih.setTarget(host);
        //4.动态生成代理类
        Rent proxy2 = (Rent) pih.getProxy();
        //5.代理执行方法
        proxy2.rent();
    }
}

执行了insertUser方法
插入了一个用户
====================================================
执行了rent方法
房东有房子要出租

 

posted @ 2023-03-18 17:10  Rui2022  阅读(13)  评论(0编辑  收藏  举报