@Inherited注释在Ava中的运用
在我们定制注释(Annotation )时,将自定义注释标记为父类不会被子类继承,但在定义注释时通过将@Inherited注释标记为自定义注释,可以将它们
自定义注释代码为以下:
package com.xdf.annotation;
import Java.lang.annotation.inherited;
import Java.lang.annotation.retention;
@Inherited
@ retention (Java.lang.annotation.retention policy.runtime ) ) ) ) )。
公共@ interfaceinheritedannotation {
字符串值(;
}
定义抽象的父类
代码是下一个:
package com.xdf.annotation;
publicabstractclassabstractparent {
@ inherited annotation (value=' parentabstractmethod ' ) ) ) ) ) )。) ) ) )。
publicabstractvoidabstractmethod (;
@ inherited annotation (value=' parent ' SDO extends ' ) ) ) ) ) ) ) ) ) )。
公共void do extends (
system.out.println (abstractparentdoextends . ' );
}
}
我们将定制的注释附加到父类的方法上。
然后定义继承抽象父类“AbstractParent”的子类
代码是下一个:
package com.xdf.annotation;
publicclasssubclassimplextendsabstractparent {
@Override
公共语音辅助方法(
System.out.println;
}
}
子类实现了abstractMethod抽象方法,并且没有重写doExtends方法。
测试类代码为以下:
package com.xdf.annotation;
import java.lang.reflect.Method;
publicclassinheritedannotationtest {
publicstaticvoidmain (string [ ] args ) throws SecurityException,NoSuchMethodException {
Class clazz=SubClassImpl.class;
//abstractMethod
method method=clazz.get method (abstract method ),new Class[]{} );
method.isannotationpresent (inherited annotation.class ) }
inheritedannotationma=method.get annotation (inherited annotation.class );
System.out.println (由子类实现的抽象方法由父类抽象方法的Annotation继承。 其信息如下。 ();
system.out.println(ma.value ) );
}else{
由System.out.println ('子类实现的抽象方法不由父类抽象方法的Annotation '继承。
}
methodmethodoverride=clazz.get method (' do extends ',new Class[]{} );
方法概述. isannotationpresent (inherited annotation.class ) }
inheritedannotationma=method override.get annotation (inherited annotation.class );
System.out.println (子类的doExtends方法由父类的doExtends方法的Annotation继承。 其信息如下。 ')
system.out.println(ma.value ) );
}else{
System.out.println (子类的doExtends方法是父类的doExtends方法的Annotation );
}
}
}
结果如下:
子类实现中的抽象方法不是由父类中的抽象方法的Annotation继承的
子类的doExtends方法由父类的doExtends方法的Annotation继承,其信息如下:
部件号为扩展
上述代码执行的结果可以得出以下结论。
1 .如果子类继承了父类并复盖了父类的带注释的方法,则父类方法的注释不会被子类继承。
2 .如果子类继承了父类,并且没有重写父类中的带注释的方法,则父类方法的注释将被子类继承。 这意味着可以在子类中获取父类方法的注释。
但是……但是,即使删除自定义评论的@Inherited评论并运行,结果也是一样的。 也就是说,此@Inherited注释完全不起作用。 这是什么?
然后,将不带@Inherited注释的自定义注释标记为类级别(不是方法级别),并按如下方式修改抽象父类:
package com.xdf.annotation;
@ inherited annotation (value=' parent ' )//将自定义注释标记为父类
publicabstractclassabstractparent {
@ inherited annotation (value=' parentabstractmethod ' ) ) ) ) ) )。) ) ) )。
publicabstractvoidabstractmethod (;
@ inherited annotation (value=' parent ' SDO extends ' ) ) ) ) ) ) ) ) ) )。
公共void do extends (
system.out.println (abstractparentdoextends . ' );
}
}
然后在测试类的main方法中添加了以下的测试代码:
if (clazz.isannotationpresent (inherited annotation.class ) )
inheritedannotationcla=clazz.get annotation (inherited annotation.class );
System.out.println (子类由父类上的Annotation继承,其信息如下: ();
system.out.println(cla.value ) );
}else{
System.out.println ('子类没有被父类的Annotation '继承;
}
如果执行main方法得到:
子类实现中的抽象方法不是由父类中的抽象方法的Annotation继承的
子类的doExtends方法由父类的doExtends方法的Annotation继承,其信息如下:
部件号为扩展
子类没有向父类继承Annotation
运行结果表明,子类没有继承父类级别的注释。 因此,我将@Inherited注释标记为自定义注释,然后尝试运行,得到了以下结果:
子类实现中的抽象方法不是由父类中的抽象方法的Annotation继承的
子类的doExtends方法由父类的doExtends方法的Annotation继承,其信息如下:
部件号为扩展
子类由父类的Annotation继承,其信息如下:
父级
请注意执行结果。 子类继承父类级别的注释。
这说明了什么?
说明在类级别应用这种带@Inherited注释的自定义注释和在方法级别应用是不同的,如果在类级别标记带@Inherited注释的自包含注释,则子类将在父类级别进行标记