资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

InvocationHandler的invoke调用次数不正常是什么情况

本篇内容介绍了“InvocationHandler的invoke调用次数不正常是什么情况”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

创新互联建站是一家专注于网站制作、成都网站设计和乐山服务器托管的网络公司,有着丰富的建站经验和案例。

大概意思就是:同一份动态代码实验代码,放在Eclipse中测试一切正常,但放在IDEA 中的springboot项目中测试时就不正常。

动态代理实验,一个接口:

public interface DestInterface {
    void fun(String msg);
}

这个接口的实现类:

public class DestClass implements DestInterface {
    public void fun(String msg) {
        System.out.println("DestClass.fun "+ msg);
    }
}
一个InvocationHandler接口的实现类:

public class DynamicProxy implements InvocationHandler {
    private Object object;//要代理的真正对象
    public DynamicProxy(Object obj) //构造并传递真正的对象
    {
        object = obj;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before proxy proxy class is " + proxy.getClass());
        System.out.println("method is " + method + ":"+method.getName() + ":"+ method.getDeclaringClass() + ":"+ method.getReturnType());
//        Object obj =  method.invoke(object,args); //出现 IllegalArgumentException: object is not an instance of declaring class
//        Object obj  = method.invoke(proxy,args); //总是不停地执行,不明白为什么会这样
        Object obj =  method.invoke(object,args);//出现类不匹配的原因是:主程序中InvocationHandler invocationHandler = new DynamicProxy(someservice);
        //其实在InvocationHandler实例化对象的时候,传入的是真正的要在其上执行函数的对象,这个对象所在类应该继承了一个或多个接口,当然这些接口在Proxy.newInstance
        // 创建代理对象的时候将这些接口的Class传入。也就是说new InvocationHandler对象的时候参数应该是目标类的对象,此例是DestInterface的实现类的对象
        System.out.println("after proxy vaue="+obj);

        return null;
    }
}
具体要想使用动态代理对象的代码如下:

DestInterface destInterface = new DestClass();//真正的目标对象
InvocationHandler invocationHandler = new DynamicProxy(destInterface);
DestInterface o =  
(DestInterface)Proxy.newProxyInstance(invocationHandler.getClass().getClassLoader(),destInterface.getClass().getInterfaces(),invocationHandler);

o.fun("abc");

在Eclipse中显示如下:

before proxy proxy class is class com.sun.proxy.$Proxy0
method is public abstract void com.joe.DestInterface.fun(java.lang.String):fun:interface com.joe.DestInterface:void
DestClass.fun abc
after proxy vaue=null

但在IDEA的springboot项目中显示如下:

before proxy proxy class is class com.sun.proxy.$Proxy41
method is public java.lang.String java.lang.Object.toString():toString:class java.lang.Object:class java.lang.String
after proxy vaue=com.joe.DestClass@1e53135d
before proxy proxy class is class com.sun.proxy.$Proxy41
method is public abstract void com.joe.DestInterface.fun(java.lang.String):fun:interface com.joe.DestInterface:void
DestClass.fun himsg
after proxy vaue=null
before proxy proxy class is class com.sun.proxy.$Proxy41
method is public java.lang.String java.lang.Object.toString():toString:class java.lang.Object:class java.lang.String
after proxy vaue=com.joe.DestClass@1e53135d

在IDEA中调试时发现当执行完Proxy.newInstance这一句之后居然发现会进入DymicProxy.invoke中执行代码,明显感觉不正常,但又不知道原因???

2021/5/11再次调试发现:

只要在IDEA中设置断点,比如在o.fun之后设置断点,也会出现次数不正常现象,但如果不设置断点直接跑则一切正常。这种现象真的很奇怪,原因不明。

在Eclipse中设不设断点一切现象都是正常的。

“InvocationHandler的invoke调用次数不正常是什么情况”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


当前文章:InvocationHandler的invoke调用次数不正常是什么情况
文章网址:http://cdkjz.cn/article/jhesdg.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

业务热线:400-028-6601 / 大客户专线   成都:13518219792   座机:028-86922220