java动态代理,invoke方法调用的次数
调试java动态代理的代码时,发现代理对象中的invoke方法中的语句重复执行。运行时正常。
public class DynamicProxyHello implements InvocationHandler{
private Object proxy;
private Object target;
public Object bind(Object target,Object proxy){
this.target=target;
this.proxy=proxy;
return Proxy.newProxyInstance(this.target.getClass().getClassLoader(),
this.target.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result=null;
Class clazz=this.proxy.getClass();
Method start=clazz.getDeclaredMethod("start",new Class[]{Method.class});
start.invoke(this.proxy,start);
method.invoke(this.target,args);
Method end=clazz.getDeclaredMethod("end",new Class[]{Method.class});
end.invoke(this.proxy,end);
return result;
}
}
public class DLogger implements ILogger{
@Override
public void start(Method method) {
System.out.println(new Date()+method.getName()+" say hello start...");
}
@Override
public void end(Method method) {
System.out.println(new Date()+method.getName()+" say hello end...");
}
}
public class Hello implements IHello{
@Override
public void sayHello(String str) {
System.out.println("hello "+str);
}
}
public interface ILogger {
void start(Method method);
void end(Method method);
}
public class Test {
public static void main(String[] args) {
IHello hello=(IHello) new DynamicProxyHello().bind(new Hello(),new DLogger());
hello.sayHello("明天");
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你咋调试的 我就输出一次啊
是不是输出了两个invoke的内容·。由于hello是一个代理对象, 所以hello的任何方法调用,都会再次触发invoke函数的调用。
这个是因为在debug模式时,编辑器如果设置了此模式下展示对象信息,那么会默认调用toString()方法,当鼠标移动到对象上时会再次调用。所以会一直输出。(可以通过重写被代理对象的toString()方法验证)][1]][1]