Proxy和InvocationHandler的一个关系?
1.Proxy并不是代理类,作用是用来去创建代理类,这个Proxy仅仅是创建代理类并返回代理类的实例对象,并不做实际性的工作(就是调用真实对象身上的方法,例如租房rent)
2.做实质性的工作是由InvocationHandler来去做的
编写动态代理类的步骤:
1.去自定义一个类,这个类实现InvocationHandler接口,并重写invoke方法
2.编写抽象角色/公共接口/Subject接口
3.编写真实对象/RealSubject/房东
4.通过Proxy工具类去创建动态代理类
5.编写客户/Test类
/**
* 抽象角色
* 代理角色和真实角色共同标准
*/
public interface Subject {
//租房
void rent();
}
/**
* 真实角色
* 房东
*/
public class RealSubject implements Subject{
@Override
public void rent() {
System.out.println("房东说:我得房子一个月300块钱");
}
}
接下来自定义一个调用处理器MyInvocationHandler,我们渴望MyInvocationHandler帮我们解决代理的问题。
MyInvocationHandler作用:做实质性工作,所以必须要有真实对象,这里的真实对象是房东
/**
* 自己定义调用处理器
* MyInvocationHandler
* 作用:做实质性工作
* 思路:必须要有真实对象/房东
*
*/
public class MyInvocationHandler implements InvocationHandler {
//此处该如何去写才能够表达可以代理所有的真实对象呢?
private Object object; //目标,真实对象
public MyInvocationHandler(Object object) {
this.object = object;
}
/**
* invoke:当代理对象去调用方法的时候,invoke就会自动得到调用
* @param proxy:代理类
* @param method:代理实例对象调用的那个方法,rent方法
* @param args:方法的参数rent方法的参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
this.doSomeThing1();
// 才是真正的表示调用的是目标对象身上的方法
method.invoke(object, args);
this.doSomeThing2();
return null;
}
private void doSomeThing1(){
System.out.println("这个是咨询费100块钱");
}
private void doSomeThing2(){
System.out.println("租房完成后,手续费300块钱");
}
}
以上我们只是自己定义调用处理器,接下来需要使用Proxy创建代理类并返回代理类的实例对象
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
MyInvocationHandler invocationHandler = new MyInvocationHandler(realSubject);
Subject subject = (Subject) Proxy.newProxyInstance(invocationHandler.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(),
invocationHandler);
subject.rent();
}
}
1.InvocationHandler:
作用:调用处理器,每一个代理实例都会有一个与之关联的调用处理器。
方法:invoke
执行流程:当一个代理实例去调用一个方法的时候,这个方法就会立刻被编码并且被派发到invoke方法中。直白一点:代理实例调用方法:这个invoke就会自动得到调用。
3.Proxy
作用:仅仅是一个工具类。Proxy作用是来创建代理类。
目的:该类提供了很多的静态方法,来去帮助我们创建动态代理类和代理类实例对象。通过Proxy类创建的动态代理类都是Proxy类的字类。
总结:
Proxy并不是代理类,作用是用来去创建代理类,这个Proxy仅仅是创建代理类并返回代理类的实例对象,并不做实际性的工作(就是调用真实对象身上的方法,例如租房rent)。想要去创建动态代理类,需要使用Proxy这个工具类。