Loading... 在使用 `Spring` 时,如果对某个 `Spring Bean` (*下文简称 `Bean`*) 使用了 AOP,那么调用 `bean.getClass()`时获取到的是代理对象,当我们想对 `Bean` 做一些反射操作时,使用代理对象是会出错的。`Spring AOP` 包中提供了一个工具类可以获取到原始对象的 Class: `AopUtils.getTargetClass` 如有 `Bean`: ```java @Service public class UserService { public void test() { System.out.println("test"); } } ``` AOP 切面: ```java @Aspect @Component public class MyAop { /** * 切入点 */ @Pointcut("execution(public * im.zhaojun.blog.code.service.*.*(..))") public void pointcut(){ } /** * 前置通知 */ @Before("pointcut()") public void deBefore(JoinPoint jp) { System.out.println("before"); } } ``` 测试类: ```java @SpringBootTest class BlogCodeDemoApplicationTests { @Resource private UserService userService; @Test void contextLoads() { Class<? extends UserService> proxyServiceClass = userService.getClass(); Class<?> serviceClass = AopUtils.getTargetClass(userService); System.out.println("代理类:" + proxyServiceClass); System.out.println("实际类:" + serviceClass); System.out.println("代理类方法个数:" + proxyServiceClass.getMethods().length); System.out.println("实际类方法个数:" + serviceClass.getMethods().length); } } ``` 输出为, 经测试结果可见,如果想要对 `AOP` 后的 `Bean` 进行反射,需要使用原始对象: ``` 代理类:class im.zhaojun.blog.code.service.UserService$$EnhancerBySpringCGLIB$$a0f386db 实际类:class im.zhaojun.blog.code.service.UserService 代理类方法个数:44 实际类方法个数:10 ``` ![1652410317394.png](https://cdn.jun6.net/2022/05/13/f0906d4c67341.png) 最后修改:2022 年 05 月 17 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果觉得我的文章对你有用,请我喝杯咖啡吧。