动态代理的两种方式是什么关系,动态代理的两种方式是什么区别
写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用
本教程操作环境:windows7系统、java8版、戴尔自交第三代电脑。
动态代理是反射的一个非常重要的应用场景。动态代理常被用于一些爪哇框架中。例如春天的达博,AOP的精力接口,就是基于爪哇动态代理实现的。
动态代理的方式有两种:
爪哇岛开发工具包动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
字节码生成动态代理:利用ASM(开源的爪哇字节码编辑库,操作字节码)开源包,将代理对象类的班级文件加载进来,通过修改其字节码生成子类来处理。
区别:JDK代理只能对实现接口的类生成代理;字节码生成是针对类实现代理,对指定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式,不能代理最后的修饰的类。
强制使用字节码生成
!- proxy-target-class=false 默认使用爪哇岛开发工具包动态代理-
AOP:AspectJ-autoproxy proxy-target-class= true /
AOP-配置代理目标类=真
!-切面详细配置-
/AOP-配置具体代码示例:
/**
* 目标接口类
*/
公共接口用户管理器{
公共void addUser(字符串id,字符串密码);
公共无效去光器(字符串id);
}/**
* 接口实现类
*/
公共类UserManagerImpl实现用户管理器{
@覆盖
公共void addUser(字符串id,字符串密码){
System.out.println(调用了UserManagerImpl.addUser()方法!);
}
@覆盖
公共空的删除器(字符串id) {
System.out.println(调用了UserManagerImpl.delUser()方法!);
}
}/**
* JDK动态代理类
*/
公共类JDKProxy实现InvocationHandler {
//需要代理的目标对象
私有对象目标对象
公共对象newProxy(Object targetObject) {
//将目标对象传入进行代理
这个。目标对象=目标对象;
//返回代理对象
返回代理。newproxyinstance(目标对象。getclass().getClassLoader()、targetObject.getClass().getInterfaces(),this);
}
//调用方法
@覆盖
公共对象调用(对象代理、方法方法、对象[]参数)抛出可投掷的
//进行逻辑处理的函数
检查pope DOM();
对象ret=null
//调用引起方法
ret=method.invoke(targetObject,args);
返回浸水使柔软
}
私有void checkPopedom() {
//模拟检查权限
System.out.println(检查权限:checkPopedom()!);
}
}/**
* CGlib动态代理类
*/
公共类CGLibProxy实现MethodInterceptor {
//CGlib需要代理的目标对象
私有对象目标对象
公共对象createProxyObject(对象对象){
this.targetObject=obj
增强剂增强剂=新增强子();
增强剂。设置超类(obj。getclass());
增强剂。设置回调(this);
对象代理obj=增强器。create();
返回proxyObj
}
@覆盖
公共对象截获(对象代理,方法方法,对象[]参数,方法代理方法代理)抛出可投掷的
对象obj=null
//过滤方法
if (addUser ).等于(方法。getname()){
//检查权限
检查pope DOM();
}
obj=method.invoke(targetObject,args);
返回目标文件
}
私有void checkPopedom() {
System.out.println(检查权限:checkPopedom()!);
}
}/**
* 测试类
*/
公共类代理测试{
公共静态void main(String[] args) {
user manager user manager=(user manager)new CGLibProxy().createProxyObject(new UserManagerImpl());
系统。出去。println( CGLibProxy:);
userManager.addUser(tom , root );
system . out . println( JDK proxy:);
JDK proxy JDK proxy=new JDK proxy();
user manager userManagerJDK=(user manager)JDK proxy . new proxy(new UserManagerImpl());
userManagerJDK.addUser(tom , root );
}
}//运行结果
CGLibProxy:
Check permissions checkPopedom()!
调用了UserManagerImpl.addUser()方法!
JDKProxy:
Check permissions checkPopedom()!
UserManagerImpl.addUser()方法已被删除!总结:
1.JDK代理使用反射机制实现aop,CGLIB代理使用字节码处理框架asm通过修改字节码生成子类。所以jdk的动态代理方法创建代理对象效率高,执行效率低,而cglib创建效率低,执行效率高。
2.JDK的动态代理机制是一种委托机制。具体来说,接口类是动态实现的。在动态生成的实现类中,委托hanlder调用原实现类的方法。CGLIB使用继承机制。具体来说,代理类和代理类是继承的,所以代理类可以分配给代理类。如果代理类有接口,代理类也可以分配给接口。
(推荐教程:java入门)以上是动态代理的两种方式的详细介绍。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。