当前位置:网站首页>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.

边栏推荐
- 期货开户哪个平台好,要正规安全的
- the warmest home
- 文献阅读十——Detect Rumors on Twitter by Promoting Information Campaigns with Generative Adversarial Learn
- Leaflets of three bouquet of roses
- go语言的日志实现(打印日志、日志写入文件、日志切割)
- BUG | The interface returns abnormal data
- panic: reflect: reflect.Value.SetString using value obtained using unexported field
- OPENCV学习DAY8
- go语言的time包介绍
- 一点点读懂Thremal(二)
猜你喜欢
随机推荐
零基础如何入门软件测试?再到测开(小编心得)
VC bmp文件总结
学生管理系统架构设计
应用联合、体系化推进。集团型化工企业数字化转型路径
ClickHouse 二级索引
文章占位 文章占位
2022/8/3
一招包治pycharm DEBUG报错 UnicodeDecodeError: ‘utf-8‘ codec can‘t decode
Pytest学习-Fixture
【无标题】
当panic或者die被执行时,或者发生未定义指令时,如何被回调到
养殖虚拟仿真软件提供高沉浸式的虚拟场景互动操作体验学习
Shell expect 实战案例
Service Mesh landing path
BUG | The interface returns abnormal data
xss总结
truffle
各行各业都受到重创,游戏行业却如火如荼,如何加入游戏模型师职业
go语言的time包介绍
【3D建模制作技巧分享】ZBrush如何设置笔刷快捷键








