问答详情
源自:4-4 解析注解

还是显示子类注解

为什么我的继承了

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

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();
        }
    
    }

}


提问者:谋士张良 2015-07-28 00:06

个回答

  • 刘果国
    2015-08-06 10:53:01
    已采纳

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

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

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

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

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

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

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

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

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

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

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