分类:jdk动态代理和cglib动态代理
jdk动态代理是由java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过
程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。jdk动态代理的应用前提,必须是目标类基于统一的接口。
例子:
接口:HelloWorldService
/** * Description: * User: lc * Date: 2017/10/16 0016 * Time: 上午 9:29 */ public interface HelloWorldService { String sayHelloWorld(String str); }
实现:HelloWorldServiceImpl
/** * Description: * User: lc * Date: 2017/10/16 0016 * Time: 上午 9:32 */ public class HelloWorldServiceImpl implements HelloWorldService { public String sayHelloWorld(String str) { System.out.println(str); return str; } }
代理类:MyInvocationHandler
/** * Description: * User: lc * Date: 2017/10/16 0016 * Time: 上午 9:42 */ public class MyInvocationHandler implements InvocationHandler { private Object object; MyInvocationHandler() { super(); } MyInvocationHandler(Object object) { this.object = object; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("object.getClass()...."+object.getClass()); System.out.println("proxy.getClass()...."+proxy.getClass()); System.out.println("各位准备开始......"); method.invoke(object, args); System.out.println("各位准备结束......"); return null; } public static void main(String[] args) { HelloWorldService hws = new HelloWorldServiceImpl(); InvocationHandler ih = new MyInvocationHandler(hws); HelloWorldService hwsProxy = (HelloWorldService) Proxy.newProxyInstance(hws.getClass().getClassLoader(), hws.getClass().getInterfaces(), ih); hwsProxy.sayHelloWorld("动态代理......"); } }
测试结果:object.getClass()....class HelloWorldServiceImpl proxy.getClass()....class com.sun.proxy.$Proxy0 各位准备开始......
各位准备结束......动态代理......