Java 反射!掌握這些就夠了
對於 java 初學者,聽到反射就覺得很難,其實並沒有你想的那麼難, 把用法搞清楚,掌握常用的一些方法。
注意對比不同方法所得到的結果有哪些不一樣。
java.lang.reflect.Type :
Type 是 Java 編程語言中所有類型的公共高級接口。
它們包括原始類型、參數化類型、數組類型、類型變量和基本類型
java.lang.Class:
繼承了 java.lang.Object 類
實現了 java.lang.reflect.Type 等接口
Class 類的實例表示正在運行的 Java 應用程序中的類和接口。
枚舉 ( enum ) 是一種類,註解 ( @interface ) 是一種接口
常用的靜態方法:
static Class<?> forName( String className )
返回與帶有給定字符串名的類或接口相關聯的 Class 對象
static Class<?> forName( String name , boolean initialize , ClassLoader loader )
使用給定的類加載器,返回與帶有給定字符串名的類或接口相關聯的 Class 對象
常用的非靜態方法:
String getName() 以 String 的形式返回此 Class 對象所表示的實體(類、接口、數組類、基本類型或 void)名稱
String getSimpleName() 返回源代碼中給出的底層類的簡稱
String getCanonicalName() 返回 Java Language Specification 中所定義的底層類的規範化名稱
Class<? super T> getSuperclass() 返回表示此 Class 所表示的實體(類、接口、基本類型或 void)的超類的 Class
Class<?>[] getInterfaces() 確定此對象所表示的類實現的接口 或 此對象所表示的接口所繼承的接口
ClassLoader getClassLoader() 返回該類的類加載器
int getModifiers() 以 int 形式返回該類的修飾符
boolean isAnnotation() 如果當前類型所表示的是一個 [註解] 則返回 true ,否則返回 false
boolean isArray() 如果當前類型所表示的是一個 [數組] 則返回 true ,否則返回 false
boolean isEnum() 如果當前類型所表示的是一個 [枚舉] 則返回 true ,否則返回 false
boolean isInterface() 如果當前類型所表示的是一個 [接口] 則返回 true ,否則返回 false
獲得某個類中的屬性的方法:
Field getDeclaredField( String name ) 獲得在本類中直接聲明指定名稱的屬性( Field )對象
private 、默認 、protected 、public
Field[] getDeclaredFields() 獲得由本類直接聲明的所有的屬性組成的 Field 數組
Field getField( String name ) 獲得本類中或父類中聲明的 public 修飾的指定名稱的屬性對應的Field對象
Field[] getFields() 獲得本類中或父類中聲明的、由 public 修飾的所有的屬性組成的 Field 數組
獲得某個類中的方法的方法:
Method getDeclaredMethod( String name , Class<?>... parameterTypes )
獲得由本類直接聲明的指定名稱、指定參數列表的方法對應的 Method 對象
Method[] getDeclaredMethods()
獲得由本類直接聲明的所有的方法對應的 Method 數組
Method getMethod( String name , Class<?>... parameterTypes )
獲得由本類或父類聲明的由 public 修飾的、指定名稱、指定參數列表的方法對應的 Method 對象
Method[] getMethods()
獲得由本類或父類聲明的所有的 public 修飾方法對應的 Method 數組
獲得某個類中的構造方法:
Constructor<T> getDeclaredConstructor( Class<?>... parameterTypes )
獲得由本類所聲明的所有的構造方法中 參數 與指定的 參數列表 匹配的那個構造方法
這些構造方法的修飾符可以是 private 、默認 、protected 、public
Constructor<?>[] getDeclaredConstructors()
獲得由本類所聲明的所有的構造方法組成的數組
這些構造方法的修飾符可以是 private 、默認 、protected 、public
Constructor<T> getConstructor( Class<?>... parameterTypes )
從本類的 public 修飾的構造方法中,尋找與 parameterTypes 相匹配的那個構造方法
Constructor<?>[] getConstructors()
獲得本類中所有的 public 修飾的構造方法組成的數組
構造方法特點: 與類名同名 、沒有返回類型 、構造不能被繼承
java.lang.reflect.Modifier
static String toString( int mod ) 返回描述指定修飾符中的訪問修飾符標誌的字符串
java.lang.reflect :
AccessibleObject 是 Field 、Method 、Constructor 類的父類
boolean isAccessible() 獲取此對象的 accessible 標誌的值
判斷指定對象是否可以被訪問,比如 private 修飾的屬性就不能直接訪問
void setAccessible( boolean flag ) 將此對象的 accessible 標誌設置為指示的布爾值
讓一個本來不能訪問的對象可以被訪問,可以寫作 setAccessible( true )
Field 表示 類 或 接口 中的屬性
int getModifiers() 以 int 形式返回該 屬性 ( Field ) 的修飾符
Class<?> getType() 返回當前屬性的類型 ( 是一個 Class 類型的對象 )
String getName() 返回此 Field 對象表示的屬性 的名稱
Object get( Object o ) 返回指定對象( o ) 中,該 Field 表示的屬性的值
void set( Object o , Object value ) 為指定對象 ( o ) 的 該屬性賦值
Method 表示 類 或 接口 中的方法
int getModifiers() 以 int 形式返回該 方法 ( Method ) 的修飾符
String getName()
Class<?> getReturnType()
Class<?>[] getParameterTypes()
Class<?>[] getExceptionTypes()
Object invoke( Object target , Object... args )
Constructor 表示 某個 類的 構造方法
int getModifiers() 以 int 形式返回該 屬性 ( Field ) 的修飾符
Class<?>[] getParameterTypes()
Class<?>[] getExceptionTypes();
java.lang.reflect.Array : 不表示數組,它提供了操作數組的方法
static int getLength( Object array ) 獲得 array 對應的數組中元素個數
static void set( Object array, int index , Object value )
相當於 array[ index ] = value ;
static Object get( Object array , int index )
相當於 Object o = array[ index ] ;
static Object newInstance( Class<?> componentType , int length )
比如 Array.newInstance( int.class , 10 ) 相當於 new int[ 10 ] ;
static ObjectnewInstance( Class<?> componentType , int... dimensions )
比如 Array.newInstance( char.class , 4 , 5 ) 相當於 new char[ 4 ] [ 5 ] ;
AccessibleObject 是 Field 、Method 、Constructor 類的父類
boolean isAccessible() 獲取此對象的 accessible 標誌的值
判斷指定對象是否可以被訪問,比如 private 修飾的屬性就不能直接訪問
void setAccessible( boolean flag ) 將此對象的 accessible 標誌設置為指示的布爾值
讓一個本來不能訪問的對象可以被訪問,可以寫作 setAccessible( true )
操作屬性:
Object get( Object o ) 返回指定對象( o ) 中,該 Field 表示的屬性的值
void set( Object o , Object value ) 為指定對象 ( o ) 的 該屬性賦值
執行構造方法
Constructor<?> con = getConstructor( Class<?>... parameterTypes ) ;
Object o = con.newInstance( Object... initargs ) ;
或:
Class<?> c = Student.class ;
Object o = c.newInstance();
執行方法
Class<?> c = Class.forName( "edu.en.entity.Student" );
Constructor<?> con = c.getConstructor( int.class , String.class );
Object s = con.newInstance( 100 , "張翠山" );
先找到指定的方法:
Method eatMethod = c.getDeclaredMethod( "eat" , String.class ) ;
讓方法執行起來:
Object result = eatMethod.invoke( s , "米飯" ); // s.eat( "麵條" );
乾貨!收藏我看行!