JDK动态代理实现


一、代理

1、代理模式:为其他对象提供一种代理以控制对这个对象的访问,可在执行业务处理的前后进行相关的预处理和后置处理,还可以用于实现延迟加载功能等

2、分类:

1)静态代理:在编译阶段为被需要代理的类,创建一个代理类。当需要被代理的类很多时,需要创建多个代理类。

2)动态代理:运行阶段进行代理,通用性强,常见:JDK动态代理和CGLIB动态代理

二、JDK动态代理实现

public interface ISubject {
String sayHellow(String name);
}
class SubjectImpl implements ISubject {
@Override
public String sayHellow(String name) {
System.out.println(name + "你好!");
return name;
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class TestInvocationHandler implements InvocationHandler {

private Object target;

public TestInvocationHandler(Object target) {
this.target = target;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("此处是前置处理");
Object result = method.invoke(target, args);
System.out.println("此处是后置处理");
return result;
}

public Object getProxy() {
return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(), this);
}

}
public class Test {
public static void main(String [] args) {
ISubject subject = new SubjectImpl();
TestInvocationHandler invocationHandler = new TestInvocationHandler(subject);
ISubject proxy = (ISubject) invocationHandler.getProxy();
proxy.sayHellow("猴子哥哥");
}
}
三、实现原理

       动态创建代理类,并通过指定类加载器加载,然后在创建代理对象时将InvokerHandler对象作为构造参数传入。当调用代理对象时,会调用InvokerHandler.invoke()方法,并最终调用真正业务对象的相应方法。


具体实现细节,请参照jdk源码,若需了解JDK动态代理与CGLIB动态代理的区别,请参考:http://blog.csdn.net/qq_21033663/article/details/52295580





智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告