zoukankan      html  css  js  c++  java
  • 注解的继承

    背景:当自定义注解遇到spring和类增强

    注解的继承有些复杂,应尽量避免使用

    当自定义注解遇到spring和类增强 第1点有改写方法遗失注解案例

    public class TestMain {
    public static void main(String []f) {

    /**
    * 结论
    * 1 getMethods,getFields只能取到父类public
    * 2 修饰类,要加@Inherited,常用于隐式的aop(cglib)
    * 3 修饰public field,无论是否加@Inherited,都取得到
    * 4 修饰public method override,无论是否加@Inherited,都取不到
    * 5 修饰public method non override,无论是否加@Inherited,都取得到
    * 6 修饰接口,无论是否加@Inherited,都取不到
    */

    // 类
    System.out.println(ByAnoCExtend.class.isAnnotationPresent(IJichen.class));
    System.out.println(ByAnoCExtend.class.isAnnotationPresent(INonJichen.class));

    // 成员
    Field [] fields = ByAnoCExtend.class.getFields();
    for(Field field : fields) {
    field.setAccessible(true);

    System.out.println(field.getName() + field.isAnnotationPresent(IJichen.class));
    System.out.println(field.getName() + field.isAnnotationPresent(INonJichen.class));
    }

    // 方法
    Method [] methods = ByAnoCExtend.class.getMethods();
    for(Method method : methods) {
    System.out.println(method.getName() + method.isAnnotationPresent(IJichen.class));
    System.out.println(method.getName() + method.isAnnotationPresent(INonJichen.class));
    }

    // 接口
    System.out.println(ByAnoIExtend.class.isAnnotationPresent(IJichen.class));
    System.out.println(ByAnoIExtend.class.isAnnotationPresent(INonJichen.class));

    }
    }

    像spring或guice使用cglib代理构建ioc的情况,需注意加到原始类的注解需要有@Inherit,运行期通过getBean().getClass().getAnnotation才能获得cglib代理生成的子类的注解

  • 相关阅读:
    软件的一般实现过程
    前端开发所需技能及理解
    前端开发所需技能
    JavaScriptlet和const的使用
    [NOI2013] 向量内积
    [省选联考 2021 A/B 卷] 滚榜
    [提高组集训2021] 模拟赛2
    [省选联考 2021 A 卷] 矩阵游戏
    [省选联考 2021 A/B 卷] 图函数
    [APIO2020] 交换城市
  • 原文地址:https://www.cnblogs.com/silyvin/p/13415913.html
Copyright © 2011-2022 走看看