假设我们要在某个类中的某些方法执行前,先执行一段我们写好的程序,可以使用静态代理,或者动态代理。
静态代理就是定义一个代理类,构造函数中传入原来的对象,代理类把原对象的方法包装一下。
动态代理则比较麻烦一点。方法如下。
- 新建一个代理类,继承InvocationHandler
public class ProxyHandler<T> implements InvocationHandler {
private T mT;
public ProxyHandler(T t) {
mT = t;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("invoke 。。。。。。。。。。");
return method.invoke(mT,args);
}
}
- 新建一个接口,接口中是需要代理的方法
public interface PersonAction {
void run();
}
- 新建一个类,实现接口PersonAction
public class Person implements PersonAction{
public Person() {
}
public void run() {
System.out.println("run。。。。。");
}
}
- 生成代理对象并调用
Person person = new Person();
ClassLoader classLoader = person.getClass().getClassLoader();
Class<?>[] interfaces = person.getClass().getInterfaces();
ProxyHandler proxyHandler = new ProxyHandler<>(person);
// 主要实现代理的方法就是newProxyInstance
Object o = Proxy.newProxyInstance(classLoader, interfaces, proxyHandler);
PersonAction pAction = (PersonAction)o;
pAction.run();
最终的输出结果