IAnnotatedElement 介面
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
代表目前在該虛擬機中執行的程式中帶有註解的元素。
[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 的型態是可遺傳的, 且 A 與 E 的超類相關聯。
</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<T>)<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<T>)<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<T>)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<T>)<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 型別註解(或其他類型 T 或 TC 型別用法)的類別檔案,若與先前版本連結,則會連結到修改過的 T 版本。
(註解類型 TC 可非正式地作為包含標註的類型,直到 T 被修改為形式可重複。或者,當 T 變得可重複 時,TC 也可以作為一種新類型引入。)
<如果>元素上存在註解類型 TC ,且 T 被修改為可重複且包含 TC 的註解類型,則:
<UL>
<li>變更到 T 在行為上 get[Declared]Annotation(Class<T>) 與(以 T 或 TC 為參數呼叫)及 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.AnnotationTypeMismatchException 或 java.lang.annotation.IncompleteAnnotationException。
已在1.5中新增。
Java 文件 java.lang.reflect.AnnotatedElement。
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。
屬性
| 名稱 | Description |
|---|---|
| Handle |
取得底層 Android 物件的 JNI 值。 (繼承來源 IJavaObject) |
| JniIdentityHashCode |
回傳包裹實例的 |
| JniManagedPeerState |
管理貴族的狀況。 (繼承來源 IJavaPeerable) |
| JniObjectReferenceControlBlock |
代表目前在該虛擬機中執行的程式中帶有註解的元素。 (繼承來源 IJavaPeerable) |
| JniPeerMembers |
成員存取與召喚支援。 (繼承來源 IJavaPeerable) |
| PeerReference |
回傳JniObjectReference包裹後的 Java 物件實例。 (繼承來源 IJavaPeerable) |
方法
| 名稱 | Description |
|---|---|
| Disposed() |
當實例被處理後才被召喚。 (繼承來源 IJavaPeerable) |
| DisposeUnlessReferenced() |
如果沒有未解決的參考資料,則 |
| 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) |
將回傳的值設為 |
| SetJniManagedPeerState(JniManagedPeerStates) |
代表目前在該虛擬機中執行的程式中帶有註解的元素。 (繼承來源 IJavaPeerable) |
| SetPeerReference(JniObjectReference) |
將回傳的值設為 |
| UnregisterFromRuntime() |
取消註冊此實例,讓執行時不會在未來 Java.Interop.JniRuntime+JniValueManager.PeekValue 的呼叫中回傳該實例。 (繼承來源 IJavaPeerable) |
擴充方法
| 名稱 | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時檢查型別轉換。 |
| JavaCast<TResult>(IJavaObject) |
代表目前在該虛擬機中執行的程式中帶有註解的元素。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |