Java Reflection 是一種
內省機制,幫助程序在
運行時對自身及軟件環境進行檢查,并根據檢查得到的程序結構,改變自身的部分行為。
核心類為
java.lang.Class 類,抽象了程序的元數據,每一個類的元數據就是一個Class對象實例。這個Class實例是一個靜態實例,對應類的每一個實例都會關聯這個靜態實例。通過Class類可以查詢該類的方法、字段、接口、構造器等一系列信息。詳見下面。
對象回去自身對應的Class實例是通過繼承自Object類的getClass()方法;
對于基本類型,每一種也有一個名為class的靜態實例,如int.class double.class boolean.class;
對于數組類型,也有Object[].class, 注意 int[][].class==int[].class
判斷對象類型的接口:
String getName() 獲得類全名
Class getComponentType() 如果對象是數組,返回數據中元素的類類型
boolean isArray()
boolean isInterface()
boolean isPrimitive()
boolean isAnnotation()
###########################################################################################################
接口
java.lang.Class中定義的檢查接口的接口:
Class[] getInterfaces()
Class getSuperClass() 直系父類 ,對于Object、接口、void關鍵字、基本類型,返回null
boolean isAssignableFrom(Class cls) 該類是參數的類型或參數的父類型
boolean isInstance(Object obj) 該類是參數的實例或者參數的子類實例
Class類和Object類存在比較糾結的關系
Class.class.isIntance(Class.class) == true Class類的class實例是Class本身的實例
Class.class.isInstance(Object.class) == true
Object.class.isAssignableFrom(Class.class) == true
Object.class.isIntance(Class.class) == true
###########################################################################################################
java.lang.reflect部分類圖
###########################################################################################################
java.lang.reflect.Constructor
java.lang.Class中相關方法
Constructor getConstructor(Class[] parameterTypes)
Constructor getDeclaredConstructor(Class[]parameterTypes)
Constructor[] getConstructors()
Constructor[] getDeclaredConstructors()
java.lang.reflect.Constructor
Class getDeclaredClass()
Class[] getExceptionTypes()
int getModifiers()
String getName()
Class[] getParameterTypes()
Object newInstance(Object[] initArgs) 創建實例
對于數組,使用 java.lang.reflect.Array.newInstance(String.class,5)形式創建實例
###########################################################################################################
java.lang.reflect.Method
java.lang.Class類中定義了如下接口查詢一個類所具有的方法。
Method getMethod(String name,Class[]parameterTypes)
Method[] getMethods()
上述2個接口查詢繼承獲得和自身聲明的方法
Method getDeclaredMethod(String name,Class[]parameterTypes)
Method[] getDeclaredMethods()
上述2個接口查詢自身聲明的方法
java.lang.reflect.Method類定義的方法
Class getDeclaringClass() 聲明該方法的類實例
Class[] getExceptionTypes() 方法的異常類型
int getModifiers() 方法的可見性
String getName() 方法名
Class[] getParameterTypes() 方法參數類型
Class getReturnType() 方法返回類型
Object invoke(Object obj,Object[]args) 反射調用一個對象上面的該方法
###########################################################################################################
java.lang.reflect.Field
java.lang.Class類中關于Field的相關方法:
Field getField(String name)
Field[] getFields()
Field getDeclaredField(String name)
Field[] getDeclaredFields()
java.lang.relect.Field中主要方法
Class getType() 返回字段的Class
Class getDeclaringClass() 返回什么該字段的Class
String getName()
int getModifiers()
Object get(Object obj) 返回obj該字段的值
boolean getBoolean(Object obj)
void set(Object obj,Object value) 設置obj該字段的值
void setBoolean(Object obj,boolean value)
###########################################################################################################
java.lang.reflect.Modifier 字段或者方法的訪問性
static boolean isPublic(int mod)
static boolean isPrivate(int mod)
共包括以下:
public static native volatile protected transient
abstract synchronized strictfp private final
###########################################################################################################
動態加載
Class cls = Class.forName(String className);
Object obj = cls.newInstance();
動態加載機制使得可以避開編譯器類范圍的限制,常見場景是jdbc驅動。動態加載機制也是通過ClassLoader實現。
通過動態加載機制的類名并不是一般意義的類名,而是:
1、基本類型,首字母大寫,如 int -> I
2、引用類型,L+全類名,如 Ljava.lang.String
3、數組類型,[+***, 如[I, [Ljava.lang.String , [[I, [[Ljava.lang.String
注意:基本類型,不能通過Class.forName()加載,會拋出異常
posted on 2011-03-31 14:06
liucs 閱讀(330)
評論(0) 編輯 收藏 所屬分類:
Java