Java动态代理的两种实现方法
2017-11-16 15:42
621 查看
AOP的拦截功能是由java中的动态代理来实现的。
AOP的源码中用到了两种动态代理来实现拦截切入功能:
jdk动态代理
由java内部的反射机制来实现的,反射机制在生成类的过程中比较高效。jdk动态代理的应用前提,必须是目标类基于统一的接口。如果没有上述前提,jdk动态代理不能应用
cglib动态代理
底层则是借助asm来实现的,asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)
由此可以看出,jdk动态代理有一定的局限性,cglib这种第三方类库实现的动态代理应用更加广泛,且在效率上更有优势。
jdk动态代理实例:
AOP的源码中用到了两种动态代理来实现拦截切入功能:
jdk动态代理
由java内部的反射机制来实现的,反射机制在生成类的过程中比较高效。jdk动态代理的应用前提,必须是目标类基于统一的接口。如果没有上述前提,jdk动态代理不能应用
cglib动态代理
底层则是借助asm来实现的,asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)
由此可以看出,jdk动态代理有一定的局限性,cglib这种第三方类库实现的动态代理应用更加广泛,且在效率上更有优势。
jdk动态代理实例:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class HelloServiceProxy implements InvocationHandler { private Object target;/ 4000 /被代理类 public Object bind(Object target) { this.target = target; //取得代理对象 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy , Method method, Object[] args) throws Throwable { Object result = null; System.out.println("-----before-----");//反射方法前调用 //反射执行方法 result=method.invoke(target, args); System.out.println("-----after-----");//反射方法后调用 return result; } public static void main(String[] args) { TestClassImpl testClass = new TestClassImpl(); HelloServiceProxy helloServiceProxy = new HelloServiceProxy(); Object obj = helloServiceProxy.bind(testClass); TestClass testClass1 = (TestClass)obj; testClass1.function(); } } interface TestClass{ public void function(); } class TestClassImpl implements TestClass{ public void function(){ System.out.println("被代理对象的测试方法"); } }
相关文章推荐
- Java动态代理的两种实现方法
- Java动态代理的两种实现方法
- Java动态代理的两种实现方法
- Java动态代理的两种实现方法
- Java动态代理的两种实现方法
- Java动态代理的两种实现方法
- Java动态代理的两种实现方法
- java动态代理的两种实现方法
- Java动态代理的两种实现方法
- Java动态代理的两种实现方法
- Java动态代理的两种实现方法
- Java动态代理的两种实现方法
- Java动态代理的两种实现方法
- Java动态代理的两种实现方法
- Java动态代理的两种实现方法
- Java动态代理的两种实现方法
- Java动态代理的两种实现方法
- Java动态代理的两种实现方法
- Java动态代理的两种实现方法
- Java动态代理的两种实现方法