語言

IAnnotatedElement 介面

定義

代表目前在該虛擬機中執行的程式中帶有註解的元素。

[Android.Runtime.Register("java/lang/reflect/AnnotatedElement", "", "Java.Lang.Reflect.IAnnotatedElementInvoker")]
public interface IAnnotatedElement : Android.Runtime.IJavaObject, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/lang/reflect/AnnotatedElement", "", "Java.Lang.Reflect.IAnnotatedElementInvoker")>]
type IAnnotatedElement = interface
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
衍生
屬性
實作

備註

代表目前在該虛擬機中執行的程式中帶有註解的元素。 此介面允許以反射方式讀取註解。 此介面中方法回傳的所有註解皆為不可變且可序列化。 呼叫者可修改呼叫者回傳的陣列,而不會影響返回給其他呼叫者的陣列。

Android 注意:回傳多個不同類型註解(如 #getAnnotations()#getDeclaredAnnotations() )的方法,可能會受到 DEX 格式所指定註解類型明示字元代碼排序的影響。 單一元素上不同類型的註解,並不保證會依原始碼中宣告的順序回傳。

#getAnnotationsByType(Class) and #getDeclaredAnnotationsByType(Class) 方法支援同一元素上多個相同類型的註解。 如果任一方法的參數是可重複的註解類型(JLS 9.6),則該方法會「瀏覽」容器註解(JLS 9.7),並回傳容器內的任何註解。 容器註解可在編譯時產生,以包裝多個參數類型的註解。

在此介面中,直接使用了 em 直接呈現/em<、>em<><>< present>/em <>以及 em<associated>/em< 這些術語>,來精確描述哪些註解會由方法回傳:<>

<UL>

<li> 註解 A 即為 <em>直接存在<於> 元素 E 上,若 E 在原始來源中被 A 註解。

<li>若解 < 被 A 的容器註解註解,則稱 A>在<元素 > 上間接存在/em。

<li>若元素 E 上有註解 A,則當以下任一條件:

<UL>

<li>A 直接位於 E 上;或

<li>A 的型 別在 E 上沒有直接的註解,且 E 是一個類,且 A 的型別是可繼承的,且 A 存在於 E 的超類上。

</ul>

<li>註解 A 若以下條件下,則 em<與>元素 < 相關>聯/em

<UL>

<li>A 直接或間接存在 於 E 上;或

<li>A 型態 的註解在 E 上不直接或間接存在 ,E 是一個 類,且 A 的型態是可遺傳的, 且 AE 的超類相關聯。

</ul>

</ul>

下表總結了此介面中不同方法所探討的標註類型。

<table class=“plain”>caption<不同 AnnotatedElement 方法>/標題<>thead<>tr<th colspan=2 scope=“col”><Method>/th<>th colspan=4 scope=“col”<Kind of Presence>/th<>tr<th scope=“col”><回傳類型>/th<>scope = “col”<簽名>/th<>scope =“col” 直接呈現/th scope =“col”< 直接呈現>/th<>scope =“col”<>間接地 Present</th><th scope=“col”>Present</th><th scope =“col”>Associated</th></thead><tbody><tr><td style=“text-align:right”>T</td><th scope=“row” style=“font-weight:normal; text-align:left”>#getAnnotation(Class) getAnnotation(Class&lt;T&gt;)<td></td><td/td><td>< td style=“text-align:center”>X</td><td></td></tr><tr td><style=”text-align:right“>Annotation[]</td><th scope=”row“ style=”font-weight:normal;text-align:left“>#getAnnotations getAnnotations()<td></td><td></td><td style=”text-align:center“>X</td><td></td></tr><tr td><style=”text-align:right“>T[]</td><th scope=”row“ style=”font-weight:normal; text-align:left“>#getAnnotationsByType(Class) getAnnotationsByType(Class&lt;T&gt;)<td></td><td></td><td></td><td td style=”text-align:center“>X/td<>/tr<>TR<TD style=”text-align:right“/><>Ttd<>th scope=”row“ style=”font-weight:normal;text-align:left“<>#getDeclaredAnnotation(Class) getDeclaredAnnotation(Class&lt;T&gt;)td style=”text-align:center“<X>/td<td></td><td></td td></td><><>/tr<>tr TD<style=”text-align:right“><>Annotation[]/td<>th scope=”row“ style=”<font-weight:normal;text-align:left“>#getDeclaredAnnotations getDeclaredAnnotations()<td style=”text-align:center“>X</td><td></td><td></td td/td td></td><></tr><tr td><style=”text-align:right“>T[]</td><th scope=”row“ style=”font-weight:normal;text-align:left“>#getDeclaredAnnotationsByType(Class) getDeclaredAnnotationsByType(Class&lt;T&gt;)<td style=”text-align:center“>X</td><td style=”text-align:center“X/td td td=”text-align:center“>X</td td/td><td/td><td td><></結束></tr></tbody></table>

對於調 get[Declared]AnnotationsByType( Class < T >)用 ,直接或間接出現在元素 E 上的註解順序,計算順序就像 E 上的間接 註解直接出現在 E 上,取代其容器註解,順序與它們在容器註解的值元素中出現的順序相同。

若註解類型 T 原本<是 em>不可<>重複,後來修改為可重複,則需注意多項相容性問題。

T 的包含註解類型為 TC。

<UL>

<Li>將 T 修改為可重複性,是與 T 既有用途及 TC 現有用途相容的原始碼與二進位。

也就是說,為了原始碼相容性,標註為 T 型或 TC 型別的原始碼仍會編譯。 為了二進位相容,具有 T 型或 TC 型別註解(或其他類型 TTC 型別用法)的類別檔案,若與先前版本連結,則會連結到修改過的 T 版本。

(註解類型 TC 可非正式地作為包含標註的類型,直到 T 被修改為形式可重複。或者,當 T 變得可重複 時,TC 也可以作為一種新類型引入。)

<如果>元素上存在註解類型 TC ,且 T 被修改為可重複且包含 TC 的註解類型,則:

<UL>

<li>變更到 T 在行為上 get[Declared]Annotation(Class<T>) 與(以 TTC 為參數呼叫)及 get[Declared]Annotations() 方法相容,因為方法的結果不會因 TC 成為 T 的標註類型而改變。

<li>更改為 T 會改變以 get[Declared]AnnotationsByType(Class<T>) 為參數呼叫的方法結果,因為這些方法現在會將 TC 型別的註解視為 T 的容器註解,並會「透視」該標註以暴露型別 T 的註解。

</ul>

<li>如果元素上存在型別 T 的註解,且 T 可重複,且該元素會加入更多型別 T 的註解:

<UL>

< > li 類型 T 的註解加入同時相容於原始碼與二進位。

<li>加入型別 T 的註解會改變方法和get[Declared]Annotation(Class<T>)方法的get[Declared]Annotations()結果,因為這些方法現在只會在元素上看到容器註解,而不會看到型別 T 的註解。

< >li 加入型態 T 的註解改變了get[Declared]AnnotationsByType(Class<T>)方法的結果,因為它們的結果會暴露出額外的型別 T 型註解,而之前它們只會暴露一個型別 T 的註解。

</ul>

</ul>

如果此介面中某方法回傳的註解包含(直接或間接) Class一個 -值成員,該成員指向該虛擬機無法存取的類別,嘗試透過呼叫該回傳註解的相關類別回傳方法來讀取該類別,將導致 TypeNotPresentException

同理,嘗試讀取一個列舉值成員時,若註解中的列舉常數已不在列舉型別中,則會導致 a EnumConstantNotPresentException

若註解型別 T 被(元)註解,且 @Repeatable 其值元素表示型 別為 TC,TC 未宣告 value() 回傳型別為 T[] 的方法,則會拋出型別 java.lang.annotation.AnnotationFormatError 例外。

最後,嘗試讀取定義不相容的成員將得到 a java.lang.annotation.AnnotationTypeMismatchExceptionjava.lang.annotation.IncompleteAnnotationException

已在1.5中新增。

Java 文件 java.lang.reflect.AnnotatedElement

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

屬性

名稱 Description
Handle

取得底層 Android 物件的 JNI 值。

(繼承來源 IJavaObject)
JniIdentityHashCode

回傳包裹實例的 java.lang.System.identityHashCode() 值。

(繼承來源 IJavaPeerable)
JniManagedPeerState

管理貴族的狀況。

(繼承來源 IJavaPeerable)
JniObjectReferenceControlBlock

代表目前在該虛擬機中執行的程式中帶有註解的元素。

(繼承來源 IJavaPeerable)
JniPeerMembers

成員存取與召喚支援。

(繼承來源 IJavaPeerable)
PeerReference

回傳JniObjectReference包裹後的 Java 物件實例。

(繼承來源 IJavaPeerable)

方法

名稱 Description
Disposed()

當實例被處理後才被召喚。

(繼承來源 IJavaPeerable)
DisposeUnlessReferenced()

如果沒有未解決的參考資料,則 Dispose()呼叫;否則,則不做任何事。

(繼承來源 IJavaPeerable)
Finalized()

當實例完成後才會被通知。

(繼承來源 IJavaPeerable)
GetAnnotation(Class)

若該註解為 <em>present</em>,否則為 null,則回傳該元素對指定型別的註解。

GetAnnotations()

回傳在此元素上 <em>存在</em> 的註解。

GetAnnotationsByType(Class)

回傳與此元素相關<><聯的>註解。

GetDeclaredAnnotation(Class)

如果該註解直接為 <em>present</em>,否則為 null,則回傳該元素對指定型別的註解。

GetDeclaredAnnotations()

回傳直接<>存在<於此元素上的>註解。

GetDeclaredAnnotationsByType(Class)

若該元素的註解為 <em>直接存在</em> 或 <em>間接呈現</em>,則回傳該元素對指定類型的註解。

IsAnnotationPresent(Class)

若指定型別的註解在此元素上為 <em>present</em> ,則回傳 true,否則為 false。

SetJniIdentityHashCode(Int32)

將回傳的值設為 JniIdentityHashCode

(繼承來源 IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

代表目前在該虛擬機中執行的程式中帶有註解的元素。

(繼承來源 IJavaPeerable)
SetPeerReference(JniObjectReference)

將回傳的值設為 PeerReference

(繼承來源 IJavaPeerable)
UnregisterFromRuntime()

取消註冊此實例,讓執行時不會在未來 Java.Interop.JniRuntime+JniValueManager.PeekValue 的呼叫中回傳該實例。

(繼承來源 IJavaPeerable)

擴充方法

名稱 Description
GetJniTypeName(IJavaPeerable)

取得實例 self類型的 JNI 名稱。

JavaAs<TResult>(IJavaPeerable)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

JavaCast<TResult>(IJavaObject)

執行 Android 執行時檢查型別轉換。

JavaCast<TResult>(IJavaObject)

代表目前在該虛擬機中執行的程式中帶有註解的元素。

TryJavaCast<TResult>(IJavaPeerable, TResult)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

適用於