解决实现类添加了@Transactional注解后,无法获取自定义注解的问题
本文记录了如何反射获取代理类上的注解,场景参考添加了@Transactional注解的实现类。
背景描述
自定义了一个注解:
1 | @Target(ElementType.TYPE) |
在一个实现类上添加此注解:
1 | @ScheduledTask |
在代码中期望通过判断是否包含注解来执行操作:
1 | if(bean.getClass().isAnnotationPresent(ScheduledTask.class)){ |
本来一切运行正常。但是,当我试图在实现类上添加事务注解@Transactional
后,这里的判断就一直是false。调试发现,当跑到这一行代码时,bean不是实现类,而是一个Proxy代理类(JdkDynamicAopProxy),所以自定义的注解一直获取不到。搜索之后,才知道这是spring的事务管理对添加了@Transactional
注解的类做了其他操作,我们获取到的是一个处理后的代理类。
解决方案
于是试图使用下面的代码获取到实际的类:
1 | Object target = ((SingletonTargetSource)((Advised) processor.getIface()).getTargetSource()).getTarget(); |
或者简单点:
1 | Class<?> = ((Advised) processor.getIface()).getTargetClass(); |
然而由于框架里面ClassLoader不一致的问题,导致不能直接转换,所以只能通过反射的方式获取到实际类:
1 | long count = new ArrayList<>(Arrays.asList(processor.getIface().getClass().getInterfaces())) |
解决了这个问题。仅作记录。