温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-06-26 09:17:03 来源:亿速云 阅读:240 作者:chen 栏目:编程语言

本篇内容介绍了“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调用次数不正常是什么情况”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI