动态代理模式:
作用:在不改变源码的情况下,对现有的方法进行增强。
代码演示;
1.一个接口:
public interface Printer {
void print();
}
2.一个实现类:被增强类
public class PrinterImpl implements Printer {
public void print(){
System.out.println("打印机打印。。。");
}
}
3.目标代理类:实现InvocationHandler接口
public class TargetProxy implements InvocationHandler {
//被代理的对象
private Object targetObject;
/**
*
* ClassLoader loader, 被代理类的类加载器
* Class<?>[] interfaces, 被代理类的所有接口
* InvocationHandler h 实现了InvocationHandler的类
*/
public Object newProxyInstance(Object targetObject){
this.targetObject=targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(),
this); //真正的代理类
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("日志记录");
// obj: 调用方法的对象
// args: 方法的参数
method.invoke(targetObject, args);
System.out.println("日志保存");
return null;
}
}
4.测试
public class ProxyTest {
public static void main(String[] args) {
TargetProxy targetProxy = new TargetProxy();
Printer printer = (Printer)targetProxy.newProxyInstance(new PrinterImpl());
printer.print();
}
}