当前位置: 首页 / 常见问题 / 正文
好程序员Java培训分享:Jdk动态代理与Cglib动态代理

2021-11-01

Java培训 好程序员 好程序员Java培训

好程序员Java培训分享:Jdk动态代理与Cglib动态代理!在前面的spring中,提到了aop的原理就是使用了动态代理,这篇文章就写一下jdk代理和cglib代理。

先在这里贴一下相关的需要代理的对象和接口。

首先是接口:

public interface TestDao {

   void test();

}

然后是实现类:

public class TestDaoImpl implements TestDao {

@Override

public void test() {

System.out.println("test dao impl");

 }

}

1.JdkProxy

jdk动态代理:JDK动态代理只能对实现了接口的类生成代理;

Jdk动态代理是利用了反射机制,在调用具体方法前或后,调用InvokeHandle来处理。

好程序员Java培训分享:Jdk动态代理与Cglib动态代理!下面来实现一个具体的Jdk动态代理,首先写一个类实现InvokeHandle,并实现它的invoke()方法

1

JdkProxy的构造方法参数为一个泛型的Object,接下来就可以利用反射机制创建一个Jdk动态代理的工厂类:

 

2

接下来写一个测试类,测试上面代码:

public static void main(String[] args) {

TestDao jdkDao = JdkDynamicObjectFactory.getProxiedObject(TestDaoImpl.class);

jdkDao.test();

}

运行测试代码,可以看到控制台输出:

jdk dynamic before...

test dao impl

jdk dynamic after...

以上就实现了Jdk动态代理,并对目标对象实现了增强。

2.CglibProxy

cglib动态代理:cglib是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法。

我们用Spring中 Enhancer 的方式来写一个CglibProxy:

3

然后同样写一个代理工厂类,参数为一个Class:

 

4

同样的,写一个测试类,测试一下cglib动态代理:

public static void main(String[] args) {

TestDao cglibDao = CglibObjectFactory.getProxiedObject(TestDaoImpl.class);

cglibDao.test();

}

运行测试代码,控制台输出如下:

cglib before...

test dao impl

cglib after...

以上就实现了cglib动态代理,并对目标对象实现了增强。

3.总结

a.jdk代理只能对实现了接口的类进行代理,而cglib代理可以对普通类进行代理;

b.jdk代理是通过反射的方式来实现动态代理,而cglib则是通过为目标类生成一个子类的方式来实现动态代理;

c.由于cglib代理是为目标类生成了一个子类,并对父类方法进行增强,所以目标类不能用final修饰。好程序员Java培训分享:Jdk动态代理与Cglib动态代理!

好程序员公众号

  • · 剖析行业发展趋势
  • · 汇聚企业项目源码

好程序员开班动态

More+
  • HTML5大前端 <高端班>

    开班时间:2021-04-12(深圳)

    开班盛况

    开班时间:2021-05-17(北京)

    开班盛况
  • 大数据+人工智能 <高端班>

    开班时间:2021-03-22(杭州)

    开班盛况

    开班时间:2021-04-26(北京)

    开班盛况
  • JavaEE分布式开发 <高端班>

    开班时间:2021-05-10(北京)

    开班盛况

    开班时间:2021-02-22(北京)

    开班盛况
  • Python人工智能+数据分析 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2020-09-21(上海)

    开班盛况
  • 云计算开发 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2019-07-22(北京)

    开班盛况
在线咨询
试听
入学教程
立即报名

Copyright 2011-2020 北京千锋互联科技有限公司 .All Right 京ICP备12003911号-5 京公网安备 11010802035720号