一、代理
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
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。