当前位置:网站首页>Implementing class target method exception using proxy object execution
Implementing class target method exception using proxy object execution
2022-08-04 23:06:00 【DanceDonkey】
使用JDKway when creating a dynamic proxy object,Usually it will be cast to the target interface type.
public class Test {
public static void main(String[] args) throws Exception{
BaseController baseController = new BaseControllerImpl();
InvocationHandler handler = new MyInvocationHandler(baseController);
BaseController target = (BaseController) Proxy.newProxyInstance(BaseController.class.getClassLoader(), new Class[]{
BaseController.class}, handler);
target.a4("111");
}
}
此时的target就是一个代理对象,同时是Proxy与BaseController的实例,At this time, it is possible to call the method of the interface when the method is called in the form of an interface,什么意思? 可参考如下代码
public static void main(String[] args)throws Exception {
Method a4 = BaseController.class.getMethod("a4", String.class);
Method a4Impl = BaseControllerImpl.class.getMethod("a4", String.class);
BaseControllerImpl baseController = new BaseControllerImpl();
a4Impl.invoke(baseController,"111");
a4.invoke(baseController,"222");
}
BaseController是接口,BaseControllerImpl 是实现类,got the interfacea4method and implementation typea4方法,然后创建了BaseController的一个实现类,Use the implementation class to invoke the two reflections separatelymethod,The call was found to be successful.

However, if the created proxy object is used to execute the method of the implementation class, an exception will be thrown.
public static void main(String[] args) throws Exception{
BaseController baseController = new BaseControllerImpl();
InvocationHandler handler = new MyInvocationHandler(baseController);
BaseController target = (BaseController) Proxy.newProxyInstance(BaseController.class.getClassLoader(), new Class[]{
BaseController.class}, handler);
Method a4 = BaseController.class.getMethod("a4", String.class);
Method a4Impl = BaseControllerImpl.class.getMethod("a4", String.class);
a4.invoke(target,"111");
a4Impl.invoke(target,"222");
}

This can actually be well understoodtarget是一个代理对象,是BaseController的代理对象,本身和BaseControllerImpl是没有关系的,They both achieved itBaseController接口,So it can be said to be a sibling relationship,However, the same method calls cannot be implemented between brothers,It must be the parent class or its own method.所以在JDKin the implemented proxy,When calling the interface target method,is a method of the interface to call.
可通过debugSee when the method is called on the proxy objectmethod签名,It is obvious that it is the method signature in the interface.对于SpringIn terms of the aspect declared in ,Aspect classes do not generate proxy objects,Just notificationSpringConfigured according to the aspectpointcut来检测bean是否需要创建代理对象,In which way to create etc,The method declared by the aspect class is only used to tellSpringWhich notification type it is.

边栏推荐
- Linux系统重启和停止Mysql服务教程
- ClickHouse 二级索引
- Latex fast insert author ORCID
- VC bmp文件总结
- CS8416国产替代DP8416 数字音频接收器
- 轮播图动态渲染
- Service Mesh landing path
- Jbpm3.2 开发HelloWorld (简单请假流程)客户端
- 文献阅读十——Detect Rumors on Twitter by Promoting Information Campaigns with Generative Adversarial Learn
- Use ngrok to optimize web pages on raspberry pi (1)
猜你喜欢
随机推荐
Deep Learning RNN Architecture Analysis
Kernel函数解析之kernel_restart
质量管理大师爱德华·戴明博士经典的质量管理14条原则
Service Mesh落地路径
得不到你的心,就用“分布式锁”锁住你的人
Latex fast insert author ORCID
论文解读(PPNP)《Predict then Propagate: Graph Neural Networks meet Personalized PageRank》
The Controller layer code is written like this, concise and elegant!
Use ngrok to optimize web pages on raspberry pi (1)
Redis理解
仪表板展示 | DataEase看中国:数据呈现中国资本市场
[QNX Hypervisor 2.2用户手册]10.6 vdev mc146818
typeScript-promise
956. 最高的广告牌
【3D建模制作技巧分享】在zbrush中如何雕刻头发 ZBrush头发雕刻小技巧
good luck
线上虚拟展馆展示具有哪些优势
MySQL的JSON 数据类型2
To Offer | 03. Repeat Numbers in the array
3D建模师为了让甲方爸爸过稿,还可以这么做,就是在赚血汗钱啊









