java元注解@Inherited的使用詳解
1.先看源碼文檔
/**
* Indicates that an annotation type is automatically inherited. If
* an Inherited meta-annotation is present on an annotation type
* declaration, and the user queries the annotation type on a class
* declaration, and the class declaration has no annotation for this type,
* then the class's superclass will automatically be queried for the
* annotation type. This process will be repeated until an annotation for this
* type is found, or the top of the class hierarchy (Object)
* is reached. If no superclass has an annotation for this type, then
* the query will indicate that the class in question has no such annotation.
*
* <p>Note that this meta-annotation type has no effect if the annotated
* type is used to annotate anything other than a class. Note also
* that this meta-annotation only causes annotations to be inherited
* from superclasses; annotations on implemented interfaces have no
* effect.
*
* @author Joshua Bloch
* @since 1.5
* @jls 9.6.3.3 @Inherited
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
上述代碼注釋部分可以用谷歌翻譯大法大致意思是
表示注釋類型自動繼承。 如果在注釋類型聲明中存在繼承的元注釋,并且用戶在類聲明上查詢注釋類型,并且類聲明沒有此類型的注釋,則該類的超類將自動查詢注釋類型。 將重復此過程,直到找到此類型的注釋,或者達到類層次結構(Object)的頂部。 如果沒有超類具有此類型的注釋,則查詢將指示所討論的類沒有這樣的注釋。
請注意,如果使用注釋類型來注釋除類之外的任何內(nèi)容,則此元注釋類型不起作用。 還要注意,這個元注釋只會導致從超類繼承注釋; 已實現(xiàn)的接口上的注釋無效。
通過上述描述可知,使用該注解的注解父類的子類可以繼承父類的注解。
2.代碼測試
2.1擁有@Inherited注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface InheritedTest {
String value();
}
@InheritedTest("擁有Inherited")
public class Person {
public void method(){
}
public void method2(){
}
}
public class Student extends Person {
}
測試:
public class TestInherited {
public static void main(String[] args) {
Class<Student> studentClass = Student.class;
if (studentClass.isAnnotationPresent(InheritedTest.class)){
System.out.println(studentClass.getAnnotation(InheritedTest.class).value());
}
}
}
輸出:

2.2未擁有@Inherited注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface IsNotInherited {
String value();
}
@IsNotInherited("未擁有Inherited")
public class Person {
public void method(){
}
public void method2(){
}
}
public class Student extends Person {
}
測試:
public class TestInherited {
public static void main(String[] args) {
Class<Student> studentClass = Student.class;
if (studentClass.isAnnotationPresent(IsNotInherited.class)){
System.out.println(studentClass.getAnnotation(IsNotInherited.class).value());
}
}
}

沒有輸出任何任容,由此可知未擁有@Inherited注解的注解的類的子類不會被繼承該注解。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Pattern.compile函數(shù)提取字符串中指定的字符(推薦)
這篇文章主要介紹了Pattern.compile函數(shù)提取字符串中指定的字符,使用的是Java中的Pattern.compile函數(shù)來實現(xiàn)對指定字符串的截取,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12

