美文网首页
注解丢失

注解丢失

作者: williamlee | 来源:发表于2018-02-27 16:05 被阅读0次

最近在开发过程中遇到了注解被抹掉的情况。
背景:引入调度框架,接入方式很简单需要在job类上打上注解@Schedule(包含@Component)使其成为spring的bean,然后在类中方法打上@Assignment注解,这样通过这个bean获取method,在通过method方法过滤存在@Assignment注解的方法即可。

Class<?> clazz = bean.getClass();
Method[] methods = clazz.getMethods();
if (methods != null && methods.length > 0) {
    for (final Method method : methods) {
        if (method.isAnnotationPresent(Assignment.class)) { 都为false
            ......
        }
    }
}

但是在使用时确总是筛选不出方法,都不带有@Assignment注解,明明已经打上了标签。

分析:因为项目中使用了spring aop cglib猜测是和这个有关系,为了清晰说明这个问题新建了个demo,目录结构如下:

目录结构

WillErase.java

@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface WillErase {
}

EraseAspect.java

@Aspect
@Component
public class EraseAspect {

    @Pointcut(value = "@annotation(com.example.demo.anno.WillErase)")
    public void pointcut() {
    }

    @Around(value = "pointcut()")
    public void before(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("======begin=======");
        pjp.proceed();
        System.out.println("======end=======");
    }

}

AopTestService.java

@Service
public class AopTestService {
    @WillErase
    public void test() {

    }
}

AopTestController.java

@RestController
public class AopTestController {
    @Autowired
    private AopTestService aopTestService;

    @GetMapping(value = "testaop")
    public String testaop() {
        aopTestService.test();
        Class<? extends AopTestService> aClass = aopTestService.getClass();
        Method[] methods = aClass.getMethods();
        Optional<Method> first = Arrays.stream(methods)
                .filter(method -> method.isAnnotationPresent(WillErase.class))
                .findFirst();
        System.out.println(first.isPresent());
        return "";
    }
}

当执行testaop的时候获取到的method确实是没结果。我们逐步debug,看下method[]中的内容:

method数组
一个简单的aoptestservice里面发现存在43个方法,去掉我们原本的test(),toString(),hashCode()...也不应该有这么多,仔细看都是cglib的enhancer给我们生成的,我们在看图中test()方法的 annotations是null的,然后大概能猜到是因为enhancer引起的,那再去验证下这个动态代理的service生成过程
AopTestService
bingo!就是在生成这个代理类的时候test()方法上的注解被抹掉了,!-_-就不说过程了。需要参考spring aop初始流程。

结论:当存在切面的时候使用enhancer生成代理类那么注解会被抹掉,即便注解是@Inherited注解。

相关文章

  • 注解丢失

    最近在开发过程中遇到了注解被抹掉的情况。背景:引入调度框架,接入方式很简单需要在job类上打上注解@Schedul...

  • 后台返回精度丢失

    后台返回数据Long类型精度丢失后台加注解解决 前台:使用 json-bigint 处理返回结果

  • Mybatis注解的缺点

    1 面对复杂的SQL显得无力,尤其是 长SQL. 2 可读性比较差 3 注解丢失了XML 上下玩相互引用的功能

  • Spring自定义组合注解生成CGLIB代理类后注解丢失

    在注解上加入@Inherited属性即可。 @Inherited 元注解是一个标记注解,@Inherited阐述了...

  • 注解学习笔记

    什么是注解注解分类注解作用分类 元注解 Java内置注解 自定义注解自定义注解实现及使用编译时注解注解处理器注解处...

  • 创建装饰器时保留函数元信息

    场景:你写了一个装饰器作用在某个函数上,但是这个函数的重要的元信息比如名字、文档字符串、注解和参数签名都丢失了 任...

  • 注解与反射

    注解 声明一个注解类型 元注解 在定义注解时,注解类也能够使用其他的注解声明。对注解类型进行注解的注解类,我们称之...

  • 1.8 Java 注解annotation

    1.1 注解声明 Java注解Annotation,有声明注解和元注解 元注解:Java提供的元注解,所谓元注解就...

  • 注解的使用

    元注解 注解 注解本质就是接口: 元注解:修饰注解的注解 自定义注解 Text.java FruitName.ja...

  • 注解

    Java注解 注解 元注解 自定义注解 元注解:负责注解其他注解 共有4个标准的meta-annotation类型...

网友评论

      本文标题:注解丢失

      本文链接:https://www.haomeiwen.com/subject/msqmxftx.html