// 1.必须要有接口方法
public interface TargetClass {
void sayHello();
int add(int a, int b);
}
// 2.目标对象实现了接口方法
public class TargetClassImpl implements TargetClass {
public void sayHello() {
System.out.println("hi dynamic proxy");
}
public int add(int a, int b) {
return a+b;
}
}
// 3. 实现了InvocationHandler接口的辅助类,该类必须持有自动生成的代理类的对象引用,需要借助该类来增强和调用目标对象的方法
/**
* @param proxy 代理类对象的引用
* @param method 目标类方法
* @param args 目标类方法参数
* @return 目标类方法的返回值
* @throws Throwable
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("我是在方法之前执行的方法");
Object invoke = method.invoke(obj, args);
System.out.println("我是在方法之后执行的方法");
return invoke;
}
//4.将目标类作为参数生成代理类,执行代理类的目标方法
public class Action {
public static void main(String[] args) {
TargetClassImpl targetClass = new TargetClassImpl();
// 用Proxy类的静态方法生成一个实际的代理类,并强转成目标类型,newProxyInstance方法需要传入一个目标类的实例供代理方法使用
TargetClass proxyInstance = (TargetClass) Proxy.newProxyInstance(targetClass.getClass().getClassLoader(), new Class[]{TargetClass.class}, new SecondProxyClass(targetClass));
proxyInstance.sayHello();
int add = proxyInstance.add(2, 5);
System.out.println(add);
}
}
执行结果
原文:https://www.cnblogs.com/python99/p/14792851.html