当前位置:网站首页>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.
边栏推荐
- Jbpm3.2 开发HelloWorld (简单请假流程)客户端
- 特征工程资料汇总
- Since a new byte of 20K came out, I have seen what the ceiling is
- 被领导拒绝涨薪申请,跳槽后怒涨9.5K,这是我的心路历程
- Both synchronized and ReentrantLock are smooth, because they are reentrant locks, and a thread will not deadlock if it takes the lock multiple times. We need reentrant locks
- Pytest学习-Fixture
- The Record of Reminding myself
- 社区分享|腾讯海外游戏基于JumpServer构建游戏安全运营能力
- Acwing3593. 统计单词
- 【3D建模制作技巧分享】ZBrush模型制作流程:地精
猜你喜欢
3D建模师为了让甲方爸爸过稿,还可以这么做,就是在赚血汗钱啊
基于内容的图像检索系统设计与实现--颜色信息--纹理信息--形状信息--PHASH--SHFT特征点的综合检测项目,包含简易版与完整版的源码及数据!
【3D建模制作技巧分享】ZBrush模型如何添加不同材质
To Offer | 03. Repeat Numbers in the array
历史上的今天:PHP公开发布;iPhone 4 问世;万维网之父诞生
加解密在线工具和进制转化在线工具
MySQL的JSON 数据类型1
MySQL的JSON 数据类型2
【3D建模制作技巧分享】ZBrush模型制作流程:地精
【3D建模制作技巧分享】在zbrush中如何雕刻头发 ZBrush头发雕刻小技巧
随机推荐
2022七夕程序员必备的表白黑科技(七夕限定款)
七牛云图片上传
360市值四年蒸发3900亿,政企安全能救命吗?
Latex快速插入作者ORCID
【转载】kill掉垃圾进程(在资源管理器占用的情况下)
论文解读(PPNP)《Predict then Propagate: Graph Neural Networks meet Personalized PageRank》
Redis理解
基于内容的图像检索系统设计与实现--颜色信息--纹理信息--形状信息--PHASH--SHFT特征点的综合检测项目,包含简易版与完整版的源码及数据!
Kernel函数解析之kernel_restart
truffle
测试技术:关于上下文驱动测试的总结
[Cultivation of internal skills of memory operation functions] memcpy + memmove + memcmp + memset (4)
[QNX Hypervisor 2.2用户手册]10.5 vdev ioapic
golang打开文件和读写文件
panic: reflect: reflect.Value.SetString using value obtained using unexported field
App测试和Web测试的区别
中国的顶级黑客在国际上是一个什么样的水平?
enumerate()函数
【3D建模制作技巧分享】zbrush贴图映射小技巧
SSM整合完整流程讲解