本篇内容介绍了“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调用次数不正常是什么情况”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。