java动态代理,invoke方法调用的次数

发布于 2022-09-07 15:25:43 字数 1834 浏览 36 评论 0

调试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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

jJeQQOZ5 2022-09-14 15:25:43

你咋调试的 我就输出一次啊

柏林苍穹下 2022-09-14 15:25:43

是不是输出了两个invoke的内容·。由于hello是一个代理对象, 所以hello的任何方法调用,都会再次触发invoke函数的调用。

萝莉病 2022-09-14 15:25:43

这个是因为在debug模式时,编辑器如果设置了此模式下展示对象信息,那么会默认调用toString()方法,当鼠标移动到对象上时会再次调用。所以会一直输出。(可以通过重写被代理对象的toString()方法验证)![![图片描述][1]][1]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文