动态代理
1.1目标对象和代理对象
在代理模式中,有目标对象和代理对象
1.1.1目标对象
目标对象指的实际上就是真正实现方法逻辑的对象,比如现在有房东,租客,中介三个人,目标对象指的就是房东,或者说是租客,因为房东或者租客才是真正实现的房屋租赁的人。
1.1.2代理对象
代理对象很好理解,代理对象实际上指的就是中介,房东通过中介这个代理对象联系到了租客这个目标对象,或者说租客通过中介联系到了房东。
1.2代理对象工厂(ProxyFactory)
代理对象工厂(ProxyFactory)就像是中介公司,通过中介公司催生出了中介这个代理对象,ProxyFactory的作用实际上就是生成一个代理对象。
在ProxyFactory中有一个方法getProxy()
public Object getProxy()
通过这个方法来获得代理对象,然后通过代理对象调用目标对象的方法来实现业务逻辑
通过Proxy类中的实例化对象方法实例化代理对象
return Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);
1.3实现InvocationHandler()接口
在getProxy()方法中需要实现InvocationHandler接口
通过实现InvocationHandler接口内的invoke()方法,来获得代理对象调用的Method对象以及参数,并且通过这个Method对象来调用目标对象的方法
InvocationHandler invocationHandler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;//被调用方法的返回值
System.out.println("调用前");
result=method.invoke(target,args);
System.out.println("调用后");
return result;
}
1.4测试
@Test
public void proxyTest(){
ProxyFactory proxyFactory=new ProxyFactory(new CalculatorImpl());
Calculator proxy = (Calculator) proxyFactory.getProxy();
System.out.println(proxy.add(1, 2));
}
控制台打印
调用前
方法内部 result = 3
调用后
3
1.5ProxyFactory代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactory {
private Object target;
public ProxyFactory(Object target) {
this.target = target;
}
public Object getProxy() {
ClassLoader classLoader = target.getClass().getClassLoader();
Class<?>[] interfaces = target.getClass().getInterfaces();
InvocationHandler invocationHandler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;//被调用方法的返回值
System.out.println("调用前");
result=method.invoke(target,args);
System.out.println("调用后");
return result;
}
};
return Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);
}
}