学的有点懵·····简单写一下个人理解,欢迎各位前辈大佬指点
1. InvocationHandler 是一个接口,通过它可以实现代理实例的方法调用,实现这个接口的时候会重写invoke方法,这个方法返回了代理的方法实现的结果。
2. proxy可以用来动态创建代理类(使用Proxy.newProxyInstance方法)
可以看到,传入的第一个参数是被代理类的类加载器,第二个参数是被代理的接口列表,第三个参数就是实现InvocationHandler接口的类,返回值是代理类实例,可以强转为传入的业务接口。
3. 所以创建动态代理类的流程就为 创建被代理接口=>实现被代理接口=>创建proxy代理类(传入构造器,接口,实现InvocationHandler 接口的代理类)=>调用业务方法
public class proxy implements InvocationHandler {
private Object target;
public void setTarget(Object target) {
this.target = target;
}
public Object getProxy(){
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this::invoke );
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object res = method.invoke(target,args);
System.out.println("测试代理类");
return res;
}
}
public class client {
public static void main(String[] args) {
//创建业务类实例
hostload hostload = new hostload();
//创建代理类实例
proxy pro = new proxy();
//告诉代理类需要代理谁
pro.setTarget(hostload);
rent rent = (org.example.rent) pro.getProxy();
//每次调用业务类方法的时候都会顺便调用代理类的invoke,就是实现InvocationHandler接口的时候重写的invoke
rent.renthost();
}
}