1. 程式人生 > >Class物件 和 java反射 AccessibleObject 類 和註解

Class物件 和 java反射 AccessibleObject 類 和註解

java 反射機制:在程式中獲取已載入到jvm中的java物件的資訊,並檢測或修改

獲取構造器

獲取成員變數

獲取方法

明顯 Accessible並不是標識方法能否訪問的. public的方法 Accessible仍為false 
使用了method.setAccessible(true)後 效能有了20倍的提升
Accessable屬性是繼承自AccessibleObject 類. 功能是啟用或禁用安全檢查

JDK API中的解釋
引用
AccessibleObject 類是 Field、Method 和 Constructor 物件的基類。它提供了將反射的物件標記為在使用時取消預設 Java 語言訪問控制檢查的能力。對於公共成員、預設(打包)訪問成員、受保護成員和私有成員,在分別使用 Field、Method 或 Constructor 物件來設定或獲得欄位、呼叫方法,或者建立和初始化類的新例項的時候,會執行訪問檢查。
在反射物件中設定 accessible 標誌允許具有足夠特權的複雜應用程式(比如 Java Object Serialization 或其他永續性機制)以某種通常禁止使用的方式來操作物件。
setAccessible 
public void setAccessible(boolean flag) 
                   throws SecurityException 
將此物件的 accessible 標誌設定為指示的布林值。值為 true 則指示反射的物件在使用時應該取消 Java 語言訪問檢查。值為 false 則指示反射的物件應該實施 Java 語言訪問檢查。
實際上setAccessible是啟用和禁用訪問安全檢查的開關,並不是為true就能訪問為false就不能訪問

 

jdk5後增加Annotation .改功能用於類,構造方法,成員變數,方法,引數等的宣告

 

public class AccessibleObject extends Object implements AnnotatedElement

AccessibleObject 類實現了AnnotatedElement,它是 Field、Method 和 Constructor 物件的基類。它提供了將反射的物件標記為在使用時取消預設 Java 語言訪問控制檢查的能力。對於公共成員、預設(打包)訪問成員、受保護成員和私有成員,在分別使用 Field、Method 或 Constructor 物件來設定或獲得欄位、呼叫方法,或者建立和初始化類的新例項的時候,會執行訪問檢查。
AccessibleObject :的方法:
isAccessible:
public boolean isAccessible()獲得此物件的 accessible 標誌的值。
此物件的返回值 就是accessible的標誌值,一般情況下無論 public,private,protected,預設等修飾的屬性的access值均為false(注意他的意思並非是訪問許可權而是對該自己執行安全檢查)。
setAccessible:
public static void setAccessible(object , boolean flag)
throws SecurityException使用單一安全性檢查(為了提高效率)為一物件設定 accessible 標誌。如果存在安全管理器,則在 ReflectPermission("suppressAccessChecks") 許可權下呼叫 checkPermission 方法。當flag 為 true,表示不開啟安全檢查,但是不能更改輸入 object的任何元素的可訪問性(例如,如果元素物件是 Class 類的 Constructor 物件),則會引發 SecurityException。如果發生 SecurityException,對於少於(不包括)發生異常的元素的陣列元素,可以將物件的可訪問性設定為 flag;對於超出(包括)引發異常的元素的那些元素,則不更改其可訪問性.

getAnnotation
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)從介面 AnnotatedElement 複製的描述 .如果存在該元素的指定型別的註釋,則返回這些註釋,否則返回 null。
指定者:介面 AnnotatedElement 中的 getAnnotation
引數: annotationClass - 對應於註釋型別的 Class 物件
返回:如果該元素的指定註釋型別的註釋存在於此物件上,則返回這些註釋,否則返回 null
isAnnotationPresent
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
從介面 AnnotatedElement 複製的描述 ,如果指定型別的註釋存在於此元素上,則返回 true,否則返回 false。此方法主要是為了便於訪問標記註釋而設計的。
指定者:介面 AnnotatedElement 中的 isAnnotationPresent
引數:annotationClass - 對應於註釋型別的 Class 物件
返回:如果指定註釋型別的註釋存在於此物件上,則返回 true,否則返回 false
getAnnotation
public Annotation[] getAnnotations()從介面 AnnotatedElement 複製的描述 ,返回此元素上存在的所有註釋。(如果此元素沒有註釋,則返回長度為零的陣列。)該方法的呼叫方可以隨意修改返回的陣列;這不會對其他呼叫方返回的陣列產生任何影響。 指定者:介面 AnnotatedElement 中的 getAnnotations
返回: 此元素上存在的所有註釋
getDeclaredAnnotation
public Annotation[] getDeclaredAnnotations()從介面 AnnotatedElement 複製的描述 返回直接存在於此元素上的所有註釋。與此介面中的其他方法不同,該方法將忽略繼承的註釋。(如果沒有註釋直接存在於此元素上,則返回長度為零的一個數組。)該方法的呼叫方可以隨意修改返回的陣列;這不會對其他呼叫方返回的陣列產生任何影響。
指定者: 介面 AnnotatedElement 中的 getDeclaredAnnotations
返回: 直接存在於此元素上的所有註釋