当前位置:网站首页>使用代理对象执行实现类目标方法异常
使用代理对象执行实现类目标方法异常
2022-08-04 22:47:00 【DanceDonkey】
使用JDK方式创建动态代理对象时,通常都是会强转为目标接口类型。
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的实例,此时以接口的形式来调用方法调用的时接口的方法是可以的,什么意思? 可参考如下代码
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 是实现类,获取了接口的a4方法和实现类型的a4方法,然后创建了BaseController的一个实现类,用实现类去分别反射调用这两个method,发现调用成功了。

但是如果是使用创建的代理对象去执行实现类的方法则会抛出异常。
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");
}

这个其实也可以很好想明白target是一个代理对象,是BaseController的代理对象,本身和BaseControllerImpl是没有关系的,他俩都实现了BaseController接口,因此可以说是兄弟关系,但是兄弟之间就不能实现相同方法的调用了,必须得是父类或自身得方法可以。所以在JDK实现的代理中,在调用接口目标方法时,是调用的接口的方法。
可通过debug查看在代理对象调用方法时的method签名,可以很明显看到是接口中的方法签名。对于Spring中声明的切面来说,切面类并不能生成代理对象,只不过是通知Spring根据切面配置的pointcut来检测bean是否需要创建代理对象,用哪种方式创建等,而切面类声明的方法只是用来告诉Spring是哪种通知类型。

边栏推荐
猜你喜欢

地面高度检测/平面提取与检测(Fast Plane Extraction in Organized Point Clouds Using Agglomerative Hierarchical Clu)

【3D建模制作技巧分享】ZBrush如何设置笔刷快捷键

Ts——项目实战应用enum枚举
![Rt-thread [二] 系统初始化流程](/img/46/6e2942e4c18c0220378050205e6528.png)
Rt-thread [二] 系统初始化流程

【字符串函数内功修炼】strcpy + strcat + strcmp(一)

【3D建模制作技巧分享】ZBrush如何使用Z球

【游戏建模模型制作全流程】在ZBrush中雕刻恶魔城男性角色模型

Qt中的常用控件
![MQTT[一]基础知识介绍](/img/25/3ba24127e2258902b2d5ecc7c3727b.png)
MQTT[一]基础知识介绍

Use ngrok to optimize web pages on raspberry pi (1)
随机推荐
【云原生 · Kubernetes】Kubernetes运维
CS8416国产替代DP8416 数字音频接收器
三个多月、40余场面试浓缩为6000字
软件测试外包公司怎么样?有什么好处和坏处?为什么没人去?
If you can't get your heart, use "distributed lock" to lock your people
Based on the results of the facts
PHP(3)
质量管理大师爱德华·戴明博士经典的质量管理14条原则
good luck
Detailed usage of LocalDateTime
Numpy on the superposition of two arrays
Jbpm3.2 开发HelloWorld (简单请假流程)客户端
直播带货为农产品开拓销售渠道
3D激光SLAM:LeGO-LOAM---两步优化的帧间里程计及代码分析
轮播图动态渲染
Pytest学习-Fixture
2022七夕程序员必备的表白黑科技(七夕限定款)
剑指Offer | 数值的整数次方
各行各业都受到重创,游戏行业却如火如荼,如何加入游戏模型师职业
【3D建模制作技巧分享】ZBrush模型制作流程:地精