【发布时间】:2022-01-03 07:05:12
【问题描述】:
public interface Action {
void doSomething();
void dontProxy();
}
例如有了这个接口,我只想让JVM代理doSomething方法。
class DynamicProxy implements InvocationHandler{
private Action work;
public DynamicProxy(Action action){
this.work = action;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName()+" start");
var tmp = method.invoke(work,args);
System.out.println(method.getName()+" end");
return tmp;
}
Action action = (Action) Proxy.newProxyInstance(handler.getClass().getClassLoader(),work.getClass().getInterfaces(),handler);
作品是Action接口实现类的一个实例。 如果我使用Proxy.newProxyInstance的话,好像是让所有的接口方法都被handler处理了。
【问题讨论】:
-
如果代码调用代理上的非代理方法,你想发生什么?
-
实现接口时,必须实现所有方法。但看来,你问错了问题。当您希望仅针对一种方法打印消息时,只需检查
method参数是否描述了您要装饰的方法,例如if(method.getName().equals("doSomething")) System.out.println("doSomething start"); var tmp = method.invoke(work,args); if(method.getName().equals("doSomething")) System.out.println("doSomething end"); return tmp;
标签: java design-patterns jvm dynamic-proxy proxy-pattern