动态代理模版
package com.charles.demo02;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class proxy implements InvocationHandler {
/**
* 我们要代理的真实对象
*/
private Object target;
//Proxy.newProxyInstance利用类加载器实例化出来一个代理
public Object getproxy(){
ClassLoader loader=target.getClass().getClassLoader();
Class []interfaces=target.getClass().getInterfaces();
Object o = Proxy.newProxyInstance(loader, interfaces,this);
return o;
}
//invoke是反射里面代理调用真实对象后走的方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log(method.getName());
Object invoke = method.invoke(target, args);
return invoke;
}
//一个利用反射获取调用方法的小技巧
public void log(String str){
System.out.println("do+"+str);
}
/**
* 构造函数,为真实对象赋初值
*/
public void setTarget(Object target) {
this.target = target;
}
}
调用实例
public class test {
public static void main(String[] args) {
proxy proxy = new proxy();
Host host=new Host();
proxy.setTarget(host);
Rent getproxy = (Rent) proxy.getproxy();
getproxy.rent();
}
}
通过分析代码可以看出Java 动态代理,具体有如下四步骤:
1通过实现 InvocationHandler 接口创建自己的调用处理器类;
2通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;
3通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;
4删除线格式 通过构造函数创建动态代理类实例,构造时调用处理器对象(handler)作为参数被传入。