广州网站优化工具服务静态网站注入
news/
2025/10/7 0:56:32/
文章来源:
广州网站优化工具服务,静态网站注入,j永久网站,wordpress二开前端动态代理jdk的Proxy与Spring的CGlib 文章目录 动态代理jdk的Proxy与Spring的CGlib1. 为什么要使用动态代理#xff1f;2. JDK Proxy 动态代理面向接口的动态代理3. CGlib动态代理4. 两个动态代理的区别 1. 为什么要使用动态代理#xff1f;
动态代理#xff1a;在不改变原有…动态代理jdk的Proxy与Spring的CGlib 文章目录 动态代理jdk的Proxy与Spring的CGlib1. 为什么要使用动态代理2. JDK Proxy 动态代理面向接口的动态代理3. CGlib动态代理4. 两个动态代理的区别 1. 为什么要使用动态代理
动态代理在不改变原有代码的情况下上进行对象功能增强 使用代理对象代替原来的对象完成功能 进而达到拓展功能的目的
2. JDK Proxy 动态代理面向接口的动态代理
特点:
一定要有接口和实现类的存在 代理对象增强的是实现类 在实现接口的方法重写的方法生成的代理对象只能转换成 接口的不能转换成 被代理类代理对象只能增强接口中定义的方法 实现类中其他和接口无关的方法是无法增强的代理对象只能读取到接口中方法上的注释 不能读取到实现类方法上的注解
使用方法:
public class Test01 {public static void main(String[] args) {Person personnew Student(xjz_2002);// 通过Porxy动态代理获得一个代理对象,在代理对象中,对某个方法进行增强
// ClassLoader loader,被代理的对象的类加载器ClassLoader classLoader dinner.getClass().getClassLoader();
// Class?[] interfaces,被代理对象所实现的所有接口Class[] interaces dinner.getClass().getInterfaces();
// InvocationHandler h,执行处理器对象,专门用于定义增强的规则InvocationHandler handler new InvocationHandler(){// invoke 当我们让代理对象调用任何方法时,都会触发invoke方法的执行public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// Object proxy, 代理对象
// Method method,被代理的方法
// Object[] args,被代理方法运行时的实参Object resnull;if(method.getName().equals(eat)){System.out.println(饭前洗手);// 让原有的eat的方法去运行res method.invoke(dinner, args);System.out.println(饭后刷碗);}else{// 如果是其他方法,那么正常执行就可以了res method.invoke(dinner, args);}return res;}};Dinner dinnerProxy (Dinner) Proxy.newProxyInstance(classLoader,interaces,handler);//dinnerProxy.eat(馒头);dinnerProxy.drink();}
}
interface Person{void eat(String foodName);void drink();
}
class Student implements Person{private String name;public Student(String name) {this.name name;}Overridepublic void eat(String foodName) {System.out.println(name正在宿舍吃foodName);}Overridepublic void drink( ) {System.out.println(name正在喝可乐);}
}
class Teacher implements Person{private String name;public Teacher(String name) {this.name name;}Overridepublic void eat(String foodName) {System.out.println(name正在食堂吃foodName);}Overridepublic void drink( ) {System.out.println(name正在喝茶);}
}3. CGlib动态代理
cglib动态代理模式是面向父类
特点
面向父类的和接口没有直接关系 不仅可以增强接口中定义的方法还可以增强其他方法可以读取父类中方法上的所有注解 使用实例
public class Test02 {Testpublic void testCglib(){Person person new Person();// 获取一个Person的代理对象// 1 获得一个Enhancer对象Enhancer enhancernew Enhancer();// 2 设置父类字节码enhancer.setSuperclass(person.getClass());// 3 获取MethodIntercepter对象 用于定义增强规则MethodInterceptor methodInterceptornew MethodInterceptor() {Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {/*Object o, 生成之后的代理对象 personProxyMethod method, 父类中原本要执行的方法 Person eat()Object[] objects, 方法在调用时传入的实参数组MethodProxy methodProxy 子类中重写父类的方法 personProxy eat()*/Object res null;if(method.getName().equals(eat)){// 如果是eat方法 则增强并运行System.out.println(饭前洗手);resmethodProxy.invokeSuper(o,objects);System.out.println(饭后刷碗);}else{// 如果是其他方法 不增强运行resmethodProxy.invokeSuper(o,objects); // 子类对象方法在执行,默认会调用父类对应被重写的方法}return res;}};// 4 设置methodInterceptorenhancer.setCallback(methodInterceptor);// 5 获得代理对象Person personProxy (Person)enhancer.create();// 6 使用代理对象完成功能personProxy.eat(馒头);}
}
class Person {public Person( ) {}public void eat(String foodName) {System.out.println(xjz_2002正在吃foodName);}
}
4. 两个动态代理的区别
JDK动态代理是面向接口的只能增强实现类中接口中存在的方法。CGlib是面向父类的可以增强父类的所有方法JDK得到的对象是JDK代理对象实例而CGlib得到的对象是被代理对象的子类
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/929864.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!