首頁  >  文章  >  Java  >  Java @Inherited

Java @Inherited

WBOY
WBOY原創
2024-08-30 16:22:26268瀏覽

Java中的@inherited是一個註解,用來標記一個註解要繼承給被註解類別的子類別。 @inherited 是一個內建註釋,我們知道註釋就像一個代表元資料的標籤,它向編譯器提供附加資訊。與 Javadoc 中存在的內建註解相同,可以在 java.lang.java 文件中建立另一個元註解。實際上有兩種類型的註釋,一種類型的註釋應用於 java 程式碼,如 @override,另一種類型的註釋應用於其他註釋,如 @target @inherited。所以@inherited是一個註釋,應用於我們想要建立子類別或我們想要繼承以使另一個使用者定義註釋的其他註釋。

廣告 該類別中的熱門課程 JAVA 掌握 - 專業化 | 78 課程系列 | 15 次模擬測驗

開始您的免費軟體開發課程

網頁開發、程式語言、軟體測試及其他

文法

java中@inherited的語法是-

@Inherited
public @interface MyAnnotation {// code of the MyAnnotation
}
@MyAnnotation
public class SuperClass {
// code of the SuperClass }
public class SubClass extends SuperClass { // code of the SubClass }

如上面的語法,類別SubClass繼承自註解@MyAnnotation,因為它繼承自SuperClass,而SuperClass有一個@MyAnnotation註解。

@Inherited 在 Java 中如何運作?

@Inherited 註解用於或註解到註解(如上述語法中的 MyAnnotation),@interface 應為其添加前綴。接下來,可以在需要應用@MyAnnotation 的地方使用此註釋(MyAnnotation)。這些註解可以在元素宣告之前應用,也可以應用於程式的任何元素,如變數、類別、建構子、方法等。當此使用者定義的註解被註釋在超類別上時,它會自動繼承到子類別(如上面語法中的子類別),正如我們在下面的範例中看到的那樣。

在 Java 中實作 @Inherited 註解的範例

接下來,我們寫java程式碼來更清楚地理解@Inherited註解,下面的範例中我們使用@Inherited註解在子類別中從超類別繼承,如下 –

範例#1

首先,我們建立一個註解介面@MyAnnotation,它有兩個字段,名稱和程式碼。

程式碼://MyAnnotation.java

package demo;
import java.lang.annotation.Inherited;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Inherited
@Target ({ElementType.TYPE, ElementType.METHOD})
@Retention (RetentionPolicy.RUNTIME)
public @interface MyAnnotation
{
String name () default "unknown";
String code () default " ";
}

接下來,我們建立一個超類別來透過註釋任何類別、方法或變數來使用上述註釋,並提供狀態名稱和狀態程式碼。

程式碼://Super.java

package demo;
import demo.MyAnnotation;
@MyAnnotation (name = "Karnataka", code = "KA")
public class Super
{
public String getstateinfo ()
{
return null;
}
}

接下來,我們使用註解,因為它是元數據,這意味著我們應該能夠獲取這個元數據或信息,以便在需要時使用註解信息。

程式碼://Demo.java

//as sub class
package demo;
import demo.MyAnnotation;
import demo.Super;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;
public class Demo extends Super
{
public static void main ( String[] arg ) throws Exception
{
new Super ();
Class <Super>obj = Super.class;
getstateinfo (obj);
Method m = obj.getMethod ("getstateinfo", new Class[]{});
getstateinfo (m);
}
static void getstateinfo (AnnotatedElement e)
{
try
{
System.out.println ("Finding annotations on " + e.getClass ().getName ());
Annotation[] annotations = e.getAnnotations ();
for (Annotation a : annotations)
{
if (a instanceof MyAnnotation)
{
MyAnnotation stateInfo = (MyAnnotation) a;
System.out.println("Name of Annotation :" + stateInfo.annotationType ());
System.out.println("State Name :" + stateInfo.name ());
System.out.println("State code :" + stateInfo.code ());
System.out.println(new Demo ().getClass ().getAnnotation (MyAnnotation.class));
System.out.println(new Super ().getClass ().getAnnotation (MyAnnotation.class));
}
}
} catch (Exception ex)
{
System.out.println( ex );
}
}
}

輸出:當我們執行 Demo.java 類別時,輸出為。

Java @Inherited

說明: 如上面的程式碼所示,MyAnnotation 註解是創建的,並且也由 @Inherited 註解。在超類別中,MyAnnotation 註解由 @MyAnnotation 語句使用並註釋到類別中。並且創建了另一個類Demo,它是Superclass的子類,因為它擴展為Superclass。再往前,在Demo 類別的main() 方法中,建立了一個Superclass 的對象,並存取其方法getstateinfo(),透過該方法迭代其所有註釋並檢查該註釋是否是MyAnnotation 的,如果是則列印一些正如我們在上面看到的資訊。但一件重要的事情是,Demo 類別或其任何元素沒有註釋到 MyAnnotation,但它仍然顯示 MyAnnotation 註解到此類,因為它是超類別固有的,而超類別繼承了 MyAnnotation。

接下來,我們重寫上面的java程式碼,以便更清楚地理解@Inherited註解,下面的例子中我們不會使用@Inherited註解來註解MyAnnotation(如上例中創建的註解)來檢查該註解是否被繼承是否位於其超類別的子類別中,如下所示–

範例#2

我們將保持Super.java 和Demo.java 類別與上方相同,在這些類別中不進行任何更改,但在MyAnnotation.java 類別中,我們做很少的更改,只是刪除@Inherited 註解以從MyAnnotation進行註釋,正如我們在下面看到的–

程式碼://MyAnnotation.java

package demo;
import java.lang.annotation.Inherited;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// no @Inherited
@Target ({ElementType.TYPE, ElementType.METHOD})
@Retention (RetentionPolicy.RUNTIME)
public @interface MyAnnotation
{
String name () default "unknown";
String code () default " ";
}

輸出: 接下來,當我們執行 Demo.java 類別時,輸出為。

Java @Inherited

說明:如上面的輸出,我們可以看到,在狀態代碼之後,印了「null」值,即語句「new  Demo ().getClass () 的回傳值」.getAnnotation (MyAnnotation.class)”,這意味著演示類別沒有從其超類別繼承(或註解)任何MyAnnotation註解,因為@Inherited註解沒有註解到MyAnnotation以在子類別中繼承它。

結論

java中的@inherited是一個應用於另一個註解的內建註解。它用於標記要繼承到被註解類別的子類別的註解。 @inherited 在 java.lang.annotation.Inherited 套件中可用。

以上是Java @Inherited的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn