动态代理

  • 在java动态代理机制中有两个很重要的接口,一个就是java.lang.reflect.InvocationHandler,另一个就是java.lang.reflect.Proxy。首先介绍下这两个接口的作用和参数。
  • 大概意思是每个动态代理类都要实现InvocationHandler接口,并且关联到一个handler,通过代理对象调用时,这个接口的方法调用就会转接到该handler的invoke方法进行调用。
    • invoke方法这里写图片描述
      • proxy,该参数是代理的真实对象
      • method,该参数是代理的方法
      • 代理方法中接受的参数
  • Proxy这个接口:
    • 静态 方法获取代理对象这里写图片描述
      • 第一个参数是需要代理的对象的classloader
      • 第二个参数是:需要代理对象的一组接口,代理之后,就可以调用这一组接口中的方法了
      • 第三个参数:是InvocationHandler表示关联到哪个Handler上

案例

  • 定义需要被代理的接口这里写图片描述
  • 定义需要被代理的实现类这里写图片描述
  • 定义代理类,必须实现InvocationHandler接口
import java.lang.invoke.MethodHandleInfo;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//定义的动态代理类
public class MyInvocationHandler implements InvocationHandler {
//  真实对象
    private Object realObject;

//  代理对象    
    private Object proxyObject;
    public MyInvocationHandler(Object reObject) {
        super();
//  构造函数初始化真实对象
        this.realObject = reObject;
//      通过真实的对象,实现代理对象
        /*
         * Proxy.newProxyInstance方法的第一个参数:真实需要代理类对象的classLoader
         * 第二个参数:需要代理对象的一组接口,代理之后,就可以使用这一组接口中的方法了
         * 第三个参数:是一个InvocationHandler对象,由我们实现InvocationHandler接口
         * */
        this.proxyObject = Proxy.newProxyInstance(realObject.getClass().getClassLoader(), 
                realObject.getClass().getInterfaces(), this);
    }

    //  获取代理对象
    public Object getProxyObject() {
        return proxyObject;
    }
    /*
     * 第一个参数:动态代理的真实对象
     * 第二个参数:代理的方法
     * 第三个参数:代理方法中接受的参数
     * */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//      
        System.out.println("在代理方法之前执行了");
        method.invoke(realObject, args);
        System.out.println("在代理方法之后执行了");
        return null;
    }




}
  • 测试用例
import org.junit.Test;

public class ProxyTest {
    @Test
    public void test1() {
//      创建需要代理的对象
        MyInterfaceImp myInterfaceImp = new MyInterfaceImp();
//      创建代理类实例
        MyInvocationHandler handler = new MyInvocationHandler(myInterfaceImp);
//      获取代理对象
        MyInterface proxy = (MyInterface) handler.getProxyObject();
        String say2 = proxy.say2();
        System.out.println(say2);

    }
}
  • 结果:这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值