最近想总结一下java的动态代理,动态代理有很多种实现方案,下面介绍三种最常用的动态搭理方案:1.jdk自带动态代理2.javassist实现动态代理3.cglib实现动态代理
接口和实现类代码:
package com.java.day1.dynamicproxy.one; public interface Interface { void doSomeThing(); }
package com.java.day1.dynamicproxy.one; public class RealSubject implements Interface{ @Override public void doSomeThing() { System.out.println("do some things.."); } }
jdk自带动态搭理实现
package com.java.day1.dynamicproxy.one; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class JdkProxyHandler implements InvocationHandler{ // 这个就是我们要代理的真实对象 private Object subject; // 构造方法,给我们要代理的真实对象赋初值 public JdkProxyHandler(Object subject) { this.subject = subject; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("do otherthings..jdk.."); return method.invoke(subject, args); } }
package com.java.day1.dynamicproxy.one; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class JdkTest { public static void main(String[] args) { //被代理的类 RealSubject rs = new RealSubject(); // 代理增强类 InvocationHandler ih = new JdkProxyHandler(rs); // 用java反射生成代理类 Interface proxy = (Interface) Proxy.newProxyInstance(ih.getClass().getClassLoader(), rs.getClass().getInterfaces(), ih); proxy.doSomeThing(); } }
javassist实现动态代理
package com.java.day1.dynamicproxy.one; import java.lang.reflect.Method; import javassist.util.proxy.MethodHandler; public class JavassitInterceptor implements MethodHandler{ private Object subject; public JavassitInterceptor(Object subject){ this.subject = subject; } @Override public Object invoke(Object self, Method m, Method prosess, Object[] args) throws Throwable { System.out.println("do other thing..javassist."); return m.invoke(subject, args); } }
package com.java.day1.dynamicproxy.one; import javassist.util.proxy.ProxyFactory; import javassist.util.proxy.ProxyObject; public class javassistTest { public static void main(String[] args) throws Exception { //被代理的类 RealSubject rs = new RealSubject(); // 代理增强类 JavassitInterceptor ih = new JavassitInterceptor(rs); // 用javassist反射生成代理类 ProxyFactory pf = new ProxyFactory(); pf.setInterfaces(rs.getClass().getInterfaces()); Class<?> proxyClass = pf.createClass(); Interface proxy = (Interface) proxyClass.newInstance(); ((ProxyObject)proxy).setHandler(ih); proxy.doSomeThing(); } }
cglib实现动态搭理
package com.java.day1.dynamicproxy.one; import java.lang.reflect.Method; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class CglibInterceptor implements MethodInterceptor { private Object subject; public CglibInterceptor(Object subject){ this.subject = subject; } @Override public Object intercept(Object object, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("do other things..cglib..."); return methodProxy.invoke(subject, objects); } }
package com.java.day1.dynamicproxy.one; import net.sf.cglib.proxy.Enhancer; public class CgligTest { public static void main(String[] args) { //被代理的类 RealSubject rs = new RealSubject(); // 代理增强类 Enhancer enhancer = new Enhancer(); CglibInterceptor ci = new CglibInterceptor(rs); enhancer.setCallback(ci); enhancer.setInterfaces(rs.getClass().getInterfaces()); Interface proxy = (Interface)enhancer.create(); proxy.doSomeThing(); } }
我还做了实验,但从创建来看jdk是最快的cglib最慢,但创建好后调用,javassist最快,jdk次之,不过是同一个数量级的,cglib最慢比其他2种慢5倍
相关推荐
java技能百练--初级界面篇java技能百练--初级界面篇java技能百练--初级界面篇java技能百练--初级界面篇
ORACL深入浅出-初级篇,ORACL深入浅出-初级篇,ORACL深入浅出-初级篇
零死角玩转stm32-初级篇
STM32初级入门,详细讲解每一个知识点,入门更轻松,缩短开发周期
ORACLe深入浅出-初级篇PPT课件.ppt
零死角玩转STM32—F429-初级篇.pdf文档
python-游戏篇-初级-飞机大战
python-游戏篇-初级-超级画板
Solidworks 工程图转换为AutoCAD图纸全攻略-初级篇,Solidworks 工程图转换为AutoCAD图纸全攻略-初级篇,Solidworks 工程图转换为AutoCAD图纸全攻略-初级篇
使用ArcGIS Mobile SDK 9.3 开发移动设备应用-初级篇
VerilogHDL教程-初级篇.ppt
stm32-初级篇3、如何新建工程模板 零死角玩转stm32-初级篇3、如何新建工程模板.pdf
ORACLe深入浅出-初级篇
零死角玩转stm32-初级篇
生产者消费者循环资料-初级篇-
零死角玩转stm32-初级篇(终结篇).zip
西门子安全矩阵安全矩阵使用入门 - 初级篇pdf,西门子安全矩阵安全矩阵使用入门 - 初级篇:本文介绍了SIMATIC安全矩阵软件的简单入门使用。本文适合于初次使用安全矩阵软件的用户
AndEngine游戏开发指南-初级篇.pdf android基于AndEngine游戏引擎开发
零死角玩转stm32-初级篇(终结篇),从零开始,玩到死角。。很好的书推荐初学者看看。。