Java 反射!掌握這些就夠了

編程語言 Java FLAG 技術 天真無邪快樂的程序員 天真無邪快樂的程序員 2017-10-03

對於 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( "麵條" );

乾貨!收藏我看行!

相關推薦

推薦中...