为了账号安全,请及时绑定邮箱和手机立即绑定

还是显示子类注解

为什么我的继承了

还是显示子类的注解(包括方法)

parent

    @Description(author = "denga", desc = "i am interface")
public class Parent {

    public String name(){
        return null;
    };
    @Description(author = "denga", desc = "i am interface method")
    public int age(){
        return 0;
    };
    @Deprecated
    public void sing(){
        
    };
}
    @Description(author = "deng", desc = "I am class annotation")
public class Child extends Parent {
    @Description(desc="i am name method annotation", author = "Deng")
    @Override //标识注解
    public String name() {
        // TODO 自动生成的方法存根
        return null;
    }

    @Override
    public int age() {
        // TODO 自动生成的方法存根
        return 0;
    }

    @Override
    public void sing() {
        // TODO 自动生成的方法存根
        System.out.println("i singing love");
    }

}
public class PareAnn {
    //1.使用加载器加载类
    public static void main(String[] args) {
        Class c;
        try {
            c = Class.forName("com.smile.zhujie.Child");
            //2.找到类上面的注解
            boolean isExit=c.isAnnotationPresent(Description.class);
            if(isExit){
                //3.拿到注解实例
                Description d=(Description) c.getAnnotation(Description.class);
                System.out.println(d.author());
            }
            //4.找到方法上的注解
            Method[] ms =c.getMethods();
            for (Method method : ms) {
                boolean isMExit=method.isAnnotationPresent(Description.class);
                if(isMExit){
                    //3.拿到注解实例
                    Description d=(Description) c.getAnnotation(Description.class);
                    System.out.println(d.desc());
                }
            }
            //另外的解析方法
            for (Method method : ms) {
                Annotation [] as=method.getAnnotations();
                for(Annotation a:as ){
                    if(a instanceof Description){
                        Description d=(Description)a;
                        System.out.println(d.desc());
                }
                }
            }
        } catch (ClassNotFoundException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    
    }

}


正在回答

1 回答

父子类继承注解这块分两种情况,一个是注解定义了@Inherited,一个是没定义。在每种情况中又分类上的注解,子类实现父类抽象方法,继承了父类方法,覆盖了父类方法这四种情况,具体继承规则如下:

1. 编写自定义注解时未写@Inherited的运行结果:        

子类的类上能否继承到父类的类上的注解?    否        

子类方法,实现了父类上的抽象方法,这个方法能否继承到注解?    否        

子类方法,继承了父类上的方法,这个方法能否继承到注解?    能        

子类方法,覆盖了父类上的方法,这个方法能否继承到注解?    否        

编写自定义注解时写了@Inherited的运行结果:

子类的类上能否继承到父类的类上的注解?     能    

子类方法,实现了父类上的抽象方法,这个方法能否继承到注解?      否    

子类方法,继承了父类上的方法,这个方法能否继承到注解?      能    

子类方法,覆盖了父类上的方法,这个方法能否继承到注解?      否    

5 回复 有任何疑惑可以回复我~
#1

谋士张良 提问者

非常感谢!
2015-08-12 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
全面解析Java注解
  • 参与学习       126970    人
  • 解答问题       102    个

注解Java中的常用技能,通过实战演示注解在实际项目中的应用

进入课程

还是显示子类注解

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信