1 jdk实现动态代理源码实现

这里需要用到InvocationHandler接口

public interface Hello {public void sayHello();
}
public class HelloImpl implements Hello {@Overridepublic void sayHello() {System.out.println("hello word");}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class HelloInvocationHandler implements InvocationHandler{private Object object;PeopleInvocationHandler(Object object){this.object = object;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("-------- start ---------");Object invoke = method.invoke(people, args);System.out.println("-------- end ---------");return invoke;}
}
import java.lang.reflect.Proxy;public class Test {public static void main(String[] args) {HelloImpl hello = new HelloImpl();HelloInvocationHandler invocationHandler = new HelloInvocationHandler(hello);Hello proxy = (Hello) Proxy.newProxyInstance(HelloImpl.getClass().getClassLoader(), HelloImpl.getClass().getInterfaces(), invocationHandler);proxy.sayHello();}
}

2 CGLib实现动态代理源码实现

这里需要用到MethodInterceptor接口和Enhancer

public class Hello {public Hello() {System.out.println("Hello...");}public void print() {System.out.println("hello word");}
}
public class CglibProxyIntercepter implements MethodInterceptor {@Overridepublic Object intercept(Object sub, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {//对目标方法进行拦截处理 System.out.println("before...");Object object = methodProxy.invokeSuper(sub, objects);System.out.println("after...");return object;}
}
public class Test {public static void main(String[] args) {//创建加强器,用来创建动态代理类Enhancer enhancer = new Enhancer();//为加强器指定要代理的业务类enhancer.setSuperclass(Hello.class);//设置回调enhancer.setCallback(new CglibProxyIntercepter());//创建代理对象Hello proxy= (Hello) enhancer.create();proxy.print();}
}

result

before...
hello word
after...

3 对比jdk实现动态代理CGLib实现动态代理

1)、JDK

内部主要是通过反射来实现。

2)、CGLib

CGLib是依靠asm字节码处理框架实现的高性能Code生成类库,可以在运行时扩展Java类或者实现接口?当然可以,CGLib对用户隐藏了asm复杂的内部实现,提供了Developer友好、面向特定功能的实现,比如方法拦截(Interpreter)、懒加载(Lazyloader & Dispatcher)等,AOP中的方法拦截,Hibernate中的延迟加载都利用了CGLib

特点:可以不通过接口实现动态代理的优点之外,还有处理速度快、效率高的优点!因为生成代码比Java反射的速度要快很多.

Java之jdk和CGLib实现动态代理相关推荐

  1. Java使用Proxy和CGLib实现动态代理

    在java中对一个方法进行改造有几种方法可以实现,分别是最常用的继承(extends).动态代理和装饰者模式.继承是最简单也是用的最多的方法,但是还是有一些场景不适用,这个时候就可能会用到动态代理.使 ...

  2. jdk与cglib的动态代理

    JDK动态代理中包含一个类和一个接口:  InvocationHandler接口:  public interface InvocationHandler {  public Object invok ...

  3. JDK动态代理和Cglib的动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 最简单的是静态代理方法,即代理模式,这里就不多啰嗦了.. 重点说一下JDK的动态代理和Cglib的动态代理吧 先说JDK的,需 ...

  4. 代理模式:aspectj静态代理和jdk,cglib的动态代理的对比

    1.使用jdk的动态代理来增强接口实现类. 原理:使用Proxy类的newProxyInstance方法运行期通过反射动态的生成代理对象 优点:不需要修改具体的业务代码,动态的增强方法,降低耦合性. ...

  5. jdk中的动态代理和cglib中动态代理的区别

    jdk中动态代理: 要求目标对象必须实现了某个接口. 代理对象和目标对象要想实现相同的功能,在底层的表现是代理对象和目标对象实现了相同的接口,因此获取代理对象后(Object类型),应该向下转型为目标 ...

  6. 深圳Java培训:Spring框架之动态代理

    深圳Java培训:Spring框架之动态代理 前言 动态代理是一种常用的设计模式,广泛应用于框架中,Spring框架的AOP特性就是应用动态代理实现的,想要理解AOP的实现原理我们就必须先理解动态代理 ...

  7. ​cglib实现动态代理构建带参数的代理实例

    2019独角兽企业重金招聘Python工程师标准>>> cglib实现动态代理构建带参数的代理实例: package com.carl.test.proxy.cglib;import ...

  8. java Spring的AOP理解和动态代理

    Spring的AOP OOP面向对象,允许开发者定义纵向的关系,但并不适用于定义横向的关系,会导致大量代码的重复,而不利于各个模块的重用. AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些 ...

  9. java类加载机制、反射、动态代理详解

    类的加载.连接和初始化(系统可能在第一次使用某个类时加载该类, 也可能采用预加载机制来加载某个类)动态代理实现 1.JVM和类 当调用 java 命令运行某个 Java 程序时, 该命令将会启动一个 ...

最新文章

  1. JAVA单向/双向链表的实现
  2. Spring中的InitializingBean的使用详解
  3. 【网址收藏】Percona-xtraDB-cluster的安装、配置和使用 PXC
  4. QTP提供的编程接口实现对QTP操作
  5. java 1.7 新特性
  6. Microsoft Visual Studio 2010 破解下载!
  7. 惠普暗影精灵3清灰_如何评价惠普笔记本这几年的表现?尤其是暗影精灵系列。...
  8. Neo4j_02了解图数据库
  9. 总结51单片机避免复位触发的几种方法
  10. Nginx 常见应用技术指南
  11. 从网管到首席架构师,我这十年的成长感悟
  12. 【亲测】Ripro子主题美化X系列主题(夏系列)-开源未加密
  13. UE4 Async Loading Screen真异步加载插件使用傻瓜式教程
  14. adb无线连接不上 解决办法
  15. Linux网络编程(四)
  16. 六十甲子亡命安葬山向宜忌
  17. ubuntu为软件设定图标
  18. git配置忽略某个文件提交
  19. loadrunner11.0 安装 破解
  20. QQ 引流引发的灰色地带产业

热门文章

  1. 【干货】单日10亿GMV的.NET5电商平台,是如何设计的?
  2. 巧用Environment.UserInteractive 实现开发和生产环境的分开调试部署
  3. .net core 下的HttpClient、WebClient性能测试
  4. 面向.NET开发人员的Dapr——分布式世界
  5. .NET之模型绑定和验证
  6. Azure 内容审查器之羞羞图审查
  7. Git 图形化操作之合并提交记录
  8. .NET Core开发实战(第21课:中间件:掌控请求处理过程的关键)--学习笔记(上)...
  9. WeihanLi.Npoi 1.7.0 更新介绍
  10. TomatoLog-1.1.0实现ILoggerFactory