Java之jdk和CGLib实现动态代理
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实现动态代理相关推荐
- Java使用Proxy和CGLib实现动态代理
在java中对一个方法进行改造有几种方法可以实现,分别是最常用的继承(extends).动态代理和装饰者模式.继承是最简单也是用的最多的方法,但是还是有一些场景不适用,这个时候就可能会用到动态代理.使 ...
- jdk与cglib的动态代理
JDK动态代理中包含一个类和一个接口: InvocationHandler接口: public interface InvocationHandler { public Object invok ...
- JDK动态代理和Cglib的动态代理
2019独角兽企业重金招聘Python工程师标准>>> 最简单的是静态代理方法,即代理模式,这里就不多啰嗦了.. 重点说一下JDK的动态代理和Cglib的动态代理吧 先说JDK的,需 ...
- 代理模式:aspectj静态代理和jdk,cglib的动态代理的对比
1.使用jdk的动态代理来增强接口实现类. 原理:使用Proxy类的newProxyInstance方法运行期通过反射动态的生成代理对象 优点:不需要修改具体的业务代码,动态的增强方法,降低耦合性. ...
- jdk中的动态代理和cglib中动态代理的区别
jdk中动态代理: 要求目标对象必须实现了某个接口. 代理对象和目标对象要想实现相同的功能,在底层的表现是代理对象和目标对象实现了相同的接口,因此获取代理对象后(Object类型),应该向下转型为目标 ...
- 深圳Java培训:Spring框架之动态代理
深圳Java培训:Spring框架之动态代理 前言 动态代理是一种常用的设计模式,广泛应用于框架中,Spring框架的AOP特性就是应用动态代理实现的,想要理解AOP的实现原理我们就必须先理解动态代理 ...
- cglib实现动态代理构建带参数的代理实例
2019独角兽企业重金招聘Python工程师标准>>> cglib实现动态代理构建带参数的代理实例: package com.carl.test.proxy.cglib;import ...
- java Spring的AOP理解和动态代理
Spring的AOP OOP面向对象,允许开发者定义纵向的关系,但并不适用于定义横向的关系,会导致大量代码的重复,而不利于各个模块的重用. AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些 ...
- java类加载机制、反射、动态代理详解
类的加载.连接和初始化(系统可能在第一次使用某个类时加载该类, 也可能采用预加载机制来加载某个类)动态代理实现 1.JVM和类 当调用 java 命令运行某个 Java 程序时, 该命令将会启动一个 ...
最新文章
- JAVA单向/双向链表的实现
- Spring中的InitializingBean的使用详解
- 【网址收藏】Percona-xtraDB-cluster的安装、配置和使用 PXC
- QTP提供的编程接口实现对QTP操作
- java 1.7 新特性
- Microsoft Visual Studio 2010 破解下载!
- 惠普暗影精灵3清灰_如何评价惠普笔记本这几年的表现?尤其是暗影精灵系列。...
- Neo4j_02了解图数据库
- 总结51单片机避免复位触发的几种方法
- Nginx 常见应用技术指南
- 从网管到首席架构师,我这十年的成长感悟
- 【亲测】Ripro子主题美化X系列主题(夏系列)-开源未加密
- UE4 Async Loading Screen真异步加载插件使用傻瓜式教程
- adb无线连接不上 解决办法
- Linux网络编程(四)
- 六十甲子亡命安葬山向宜忌
- ubuntu为软件设定图标
- git配置忽略某个文件提交
- loadrunner11.0 安装 破解
- QQ 引流引发的灰色地带产业
热门文章
- 【干货】单日10亿GMV的.NET5电商平台,是如何设计的?
- 巧用Environment.UserInteractive 实现开发和生产环境的分开调试部署
- .net core 下的HttpClient、WebClient性能测试
- 面向.NET开发人员的Dapr——分布式世界
- .NET之模型绑定和验证
- Azure 内容审查器之羞羞图审查
- Git 图形化操作之合并提交记录
- .NET Core开发实战(第21课:中间件:掌控请求处理过程的关键)--学习笔记(上)...
- WeihanLi.Npoi 1.7.0 更新介绍
- TomatoLog-1.1.0实现ILoggerFactory