您的位置:首页 > 编程语言 > Java开发

Java动态代理的两种实现方法

2017-11-16 15:42 621 查看
AOP的拦截功能是由java中的动态代理来实现的。

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("被代理对象的测试方法");
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: