【深入理解java虚拟机】第2集-JDK动态代理的原理

12 篇文章 0 订阅
1 篇文章 0 订阅

java有两种动态代理

一:JDK动态代理:Proxy

二:CGLIB动态代理:Enhancer

动态代理的实质是利用字节码工具,生成新的代理类,替换原始的类。

我们首先看JDK代理模式

创建代理对象需要入参 ClassLoader,被代理的对象的接口数组,一个新的InvocationHandler。

看demo

public class ProxyFactoryTest {
    public static Object getProxyObj(Object targetObj){
        MyInvocationHandler invocation = new MyInvocationHandler(targetObj);
        return  Proxy.newProxyInstance(targetObj.getClass().getInterfaces()[0].getClassLoader(),new Class[]{ targetObj.getClass().getInterfaces()[0]}, invocation);
    }
}
public class MyInvocationHandler implements InvocationHandler {

    private Object originBean;

    public MyInvocationHandler(Object originBean) {
        this.originBean = originBean;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        beforeProxy();
        Object result = method.invoke(originBean, args);
        afterProxy();
        return result;
    }

    private void afterProxy() {
        System.out.println("after proxy");
    }

    private void beforeProxy() {
        System.out.println("before proxy");
    }
}
public interface SelfInterface {
    String getName();
}
public class SelfBean implements SelfInterface {
    @Override
    public String getName() {

        System.out.println("selfBean");
        return "this is SelfBean";
    }
}

在我们调用ProxyFactoryTest的getProxyObj方法的时候,我们生成了一个新的class

新的Class继承了Proxy,实现了实际SelfBean的接口。那在执行getName()方法是,字节码已经变成了执行InvocationHandler的invoke()方法,这个就是我们在新建代理对象时,传入的自定义的InvocationHandler;

上面就是JDK的动态代理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值