JDK与CGlib动态代理的实现
程序员文章站
2022-03-24 22:17:11
应用的原型为 执行者:房屋中介Agency(分为JDKAgency、CGlibAgency) 被代理对象:程序员Programmer 被代理对象的实现接口:租户Tenement(CGlibAgency时不需要实现接口) JDK动态代理:执行者 JDKAgency CGlib动态代理:执行者 CGli ......
应用的原型为
执行者:房屋中介agency(分为jdkagency、cglibagency)
被代理对象:程序员programmer
被代理对象的实现接口:租户tenement(cglibagency时不需要实现接口)
tenement 接口:
package com.suzao.spring.test; /** * tenement * @description 租户 * @param * @return * @author mc * @date 2018/12/28 16:44 */ public interface tenement { /** * renthouse * @description 租房方法 * @param [] * @return * @author mc * @date 2018/12/28 18:51 */ void renthouse(); }
programmer 实现类
package com.suzao.spring.test; /** * programmer * @description 程序员 * @param * @return * @author mc * @date 2018/12/28 18:21 */ public class programmer implements tenement { /** * renthouse * @description 租房方法 * @param [] * @return * @author mc * @date 2018/12/28 18:52 */ @override public void renthouse() { system.out.println("我是程序员,我在找房子!"); } }
jdk动态代理:执行者 jdkagency
package com.suzao.spring.test; import java.lang.reflect.invocationhandler; import java.lang.reflect.method; import java.lang.reflect.proxy; /** * jdkagency * @description jdk房屋中介 * @param * @return * @author mc * @date 2018/12/28 18:22 */ public class jdkagency implements invocationhandler{ //拿到被代理对象的引用 private tenement target; public object gettenementproxy(tenement target){ this.target = target; class clazz = target.getclass(); //clazz.getinterfaces() 获取它的接口 //重新动态生成一个class字节码 //编译 return proxy.newproxyinstance(clazz.getclassloader(),clazz.getinterfaces(),this); } @override public object invoke(object proxy, method method, object[] args) throws throwable { system.out.println("jdk房屋中介开始执行。。。"); system.out.println("----------------------------"); method.invoke(this.target,args); system.out.println("----------------------------"); system.out.println("jdk房屋中介结束执行。。。"); return null; } }
cglib动态代理:执行者 cglibagency
package com.suzao.spring.test; import org.springframework.cglib.proxy.enhancer; import org.springframework.cglib.proxy.methodinterceptor; import org.springframework.cglib.proxy.methodproxy; import java.lang.reflect.method; /** * cglibagency * @description cglib 租房中介 * @param * @return * @author mc * @date 2018/12/28 19:11 */ public class cglibagency implements methodinterceptor{ public object gettenmentproxy(class clazz){ enhancer enhancer = new enhancer(); //告诉cglib,生成的子类需要继承那个类 enhancer.setsuperclass(clazz); //设置回调 enhancer.setcallback(this); //加载到jvm中,并返回代理对象 return enhancer.create(); } @override public object intercept(object obj, method method, object[] args, methodproxy methodproxy) throws throwable { system.out.println("cglib房屋中介开始执行。。。"); system.out.println("----------------------------"); methodproxy.invokesuper(obj,args); system.out.println("----------------------------"); system.out.println("cglib房屋中介结束执行。。。"); return null; } }
代理测试类 testproxy
package com.suzao.spring.test; /** * testproxy * @description 测试代理 * @param * @return * @author mc * @date 2018/12/28 18:46 */ public class testproxy { public static void main(string[] args) { //java动态代理是利用反射机制生成一个实现被代理对象的接口的匿名类,在调用具体方法前调用invokehandler来处理。 //执行者 jdkagency //被代理对象 programmer //被代理对象实现的接口 tenement tenement tenement= (tenement) new jdkagency().gettenementproxy(new programmer()); tenement.renthouse(); system.out.println("\n\n"); //cglib动态代理利用asm开源包,对被代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。 //执行者 cglibagency //被代理对象 programmer programmer programmer= (programmer) new cglibagency().gettenmentproxy(new programmer().getclass()); programmer.renthouse(); } }
执行结果:
jdk房屋中介开始执行。。。 ---------------------------- 我是程序员,我在找房子! ---------------------------- jdk房屋中介结束执行。。。 cglib房屋中介开始执行。。。 ---------------------------- 我是程序员,我在找房子! ---------------------------- cglib房屋中介结束执行。。。
pom.xml中引用:
<dependency> <groupid>org.springframework</groupid> <artifactid>spring-core</artifactid> <version>${org.springframework-version}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-beans</artifactid> <version>${org.springframework-version}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-aop</artifactid> <version>${org.springframework-version}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-context</artifactid> <version>${org.springframework-version}</version> </dependency>