Java反射機制的使用


一:反射是什么

    JAVA反射機制是在運行狀態中,對於任意一個類,都能夠獲取這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取類信息以及動態調用對象內容就稱為java語言的反射機制

二:反射的作用

  • 在運行時判斷任意一個對象所屬的類;

  • 在運行時構造任意一個類的對象;

  • 在運行時判斷任意一個類所具有的成員變量和方法;

  • 在運行時調用任意一個對象的方法;

三:反射的實現

    我們知道,要使用一個類,就要先把它加載到虛擬機中,生成一個Class對象。這個class對象就保存了這個類的一切信息。

    反射機制的實現,就是獲取這個Class對象,通過Class對象去訪問類、對象的元數據以及運行時的數據

    三種方法獲得類的Class對象:Class.forName(String className)、className.class、實例對象.getClass();

四:反射涉及的API

    反射首先獲取Class對象;然后獲取Method類和Field類;最后通過Method和Field類進行具體的方法調用或屬性訪問

  1:在運行時獲取對象所屬類的類名等信息

對象名.getClass().getName();

    2:通過反射機制創建class對象(三種方法

        class1 = Class.forName(className);
        class2 = 對象名.getClass(); class3 = 對象名.class;

    3:在運行時,通過創建class對象,獲取自己的父類信息

 Class<?> clazz = Class.forName(當前類);
 Class<?> parentClass = clazz.getSuperclass(); parentClass.getName();//獲得父類名

    4:通過反射機制創建一個類的對象

1:反射創建class對象(見上面)
2:Classname 對象=classname.newInstance(參數);

    5:獲取類的全部方法,存於一個數組中

//創建class對象
   Class<?> clazz = Class.forName(ClassName);
// 返回聲明的所有方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法
   Method[] getDeclaredMethods();
   //返回可被訪問的公共方法      
   Method method[] = clazz.getMethods();

6:獲取類的全部字段,存於一個數組中

Class<?> clazz = Class.forName(classname);
       // 取得本類已聲明的所有字段,包括私有的、保護的
        Field[] field = clazz.getDeclaredFields();
      // 取得本類中可訪問的所有公共字段
        Field[] filed1 = clazz.getFields();

7:操作類/對象 的某個屬性(包括私有)

Class<?> clazz = Class.forName(classname);

//返回一個 Field 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明字段。 包括公共、私有、保護的字段。
  Field field = clazz.getDeclaredField(字段名);

//禁用Java權限修飾符的作用,無視方法權限限制進行訪問
 field.setAccessible(true);

// void set(Object obj, Object value) 將指定對象變量上此 Field 對象表示的字段設置為指定的新值。           
  field.set(該類的一個對象, 字段值);

   8:調用類/對象 的某個方法(包括私有)

Class<?> clazz = Class.forName(classname);

// Method getMethod(String name, Class<?>... parameterTypes) 
//返回一個 Method 對象,它反映此 Class 對象所表示的類或接口的指定公共成員方法。
//獲取一個公有函數   Method method = clazz.getMethod(方法名,參數類型); //調用具體某個實例對象的這個公有方法   method.invoke(實例對象,參數值); // Method getDeclaredMethod(String name, Class<?>... parameterTypes) //返回一個 Method 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明方法。 包括私有、保護、公有方法 //獲取一個私有函數 Method private_method=class.getDeclaredMethod(函數名,參數類型); //禁用Java權限限定符的作用,使私有函數可訪問 private_method.setAccessible(true); //調用具體實例對象的這個方法 private_method.invoke(實例對象,參數);

五:附錄

    Class對象的方法列表

<U> Class<? extends U>
asSubclass(Class<U> clazz)
          強制轉換該 Class 對象,以表示指定的 class 對象所表示的類的一個子類。
 T cast(Object obj)
          將一個對象強制轉換成此 Class 對象所表示的類或接口。
 boolean desiredAssertionStatus()
          如果要在調用此方法時將要初始化該類,則返回將分配給該類的斷言狀態。
static Class<?> forName(String className)
          返回與帶有給定字符串名的類或接口相關聯的 Class 對象。
static Class<?> forName(String name, boolean initialize, ClassLoader loader)
          使用給定的類加載器,返回與帶有給定字符串名的類或接口相關聯的 Class 對象。
<A extends Annotation>
A
getAnnotation(Class<A> annotationClass)
          如果存在該元素的指定類型的注釋,則返回這些注釋,否則返回 null。
 Annotation[] getAnnotations()
          返回此元素上存在的所有注釋。
 String getCanonicalName()
          返回 Java Language Specification 中所定義的底層類的規范化名稱。
 Class<?>[] getClasses()
          返回一個包含某些 Class 對象的數組,這些對象表示屬於此 Class 對象所表示的類的成員的所有公共類和接口。
 ClassLoader getClassLoader()
          返回該類的類加載器。
 Class<?> getComponentType()
          返回表示數組組件類型的 Class
 Constructor<T> getConstructor(Class<?>... parameterTypes)
          返回一個 Constructor 對象,它反映此 Class 對象所表示的類的指定公共構造方法。
 Constructor<?>[] getConstructors()
          返回一個包含某些 Constructor 對象的數組,這些對象反映此 Class 對象所表示的類的所有公共構造方法。
 Annotation[] getDeclaredAnnotations()
          返回直接存在於此元素上的所有注釋。
 Class<?>[] getDeclaredClasses()
          返回 Class 對象的一個數組,這些對象反映聲明為此 Class 對象所表示的類的成員的所有類和接口。
 Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
          返回一個 Constructor 對象,該對象反映此 Class 對象所表示的類或接口的指定構造方法。
 Constructor<?>[] getDeclaredConstructors()
          返回 Constructor 對象的一個數組,這些對象反映此 Class 對象表示的類聲明的所有構造方法。
 Field getDeclaredField(String name)
          返回一個 Field 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明字段。
 Field[] getDeclaredFields()
          返回 Field 對象的一個數組,這些對象反映此 Class 對象所表示的類或接口所聲明的所有字段。
 Method getDeclaredMethod(String name, Class<?>... parameterTypes)
          返回一個 Method 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明方法。
 Method[] getDeclaredMethods()
          返回 Method 對象的一個數組,這些對象反映此 Class 對象表示的類或接口聲明的所有方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法。
 Class<?> getDeclaringClass()
          如果此 Class 對象所表示的類或接口是另一個類的成員,則返回的 Class 對象表示該對象的聲明類。
 Class<?> getEnclosingClass()
          返回底層類的立即封閉類。
 Constructor<?> getEnclosingConstructor()
          如果該 Class 對象表示構造方法中的一個本地或匿名類,則返回 Constructor 對象,它表示底層類的立即封閉構造方法。
 Method getEnclosingMethod()
          如果此 Class 對象表示某一方法中的一個本地或匿名類,則返回 Method 對象,它表示底層類的立即封閉方法。
 T[] getEnumConstants()
          如果此 Class 對象不表示枚舉類型,則返回枚舉類的元素或 null。
 Field getField(String name)
          返回一個 Field 對象,它反映此 Class 對象所表示的類或接口的指定公共成員字段。
 Field[] getFields()
          返回一個包含某些 Field 對象的數組,這些對象反映此 Class 對象所表示的類或接口的所有可訪問公共字段。
 Type[] getGenericInterfaces()
          返回表示某些接口的 Type,這些接口由此對象所表示的類或接口直接實現。
 Type getGenericSuperclass()
          返回表示此 Class 所表示的實體(類、接口、基本類型或 void)的直接超類的 Type
 Class<?>[] getInterfaces()
          確定此對象所表示的類或接口實現的接口。
 Method getMethod(String name, Class<?>... parameterTypes)
          返回一個 Method 對象,它反映此 Class 對象所表示的類或接口的指定公共成員方法。
 Method[] getMethods()
          返回一個包含某些 Method 對象的數組,這些對象反映此 Class 對象所表示的類或接口(包括那些由該類或接口聲明的以及從超類和超接口繼承的那些的類或接口)的公共 member 方法。
 int getModifiers()
          返回此類或接口以整數編碼的 Java 語言修飾符。
 String getName()
          以 String 的形式返回此 Class 對象所表示的實體(類、接口、數組類、基本類型或 void)名稱。
 Package getPackage()
          獲取此類的包。
 ProtectionDomain getProtectionDomain()
          返回該類的 ProtectionDomain
 URL getResource(String name)
          查找帶有給定名稱的資源。
 InputStream getResourceAsStream(String name)
          查找具有給定名稱的資源。
 Object[] getSigners()
          獲取此類的標記。
 String getSimpleName()
          返回源代碼中給出的底層類的簡稱。
 Class<? super T> getSuperclass()
          返回表示此 Class 所表示的實體(類、接口、基本類型或 void)的超類的 Class
 TypeVariable<Class<T>>[] getTypeParameters()
          按聲明順序返回 TypeVariable 對象的一個數組,這些對象表示用此 GenericDeclaration 對象所表示的常規聲明來聲明的類型變量。
 boolean isAnnotation()
          如果此 Class 對象表示一個注釋類型則返回 true。
 boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
          如果指定類型的注釋存在於此元素上,則返回 true,否則返回 false。
 boolean isAnonymousClass()
          當且僅當底層類是匿名類時返回 true
 boolean isArray()
          判定此 Class 對象是否表示一個數組類。
 boolean isAssignableFrom(Class<?> cls)
          判定此 Class 對象所表示的類或接口與指定的 Class 參數所表示的類或接口是否相同,或是否是其超類或超接口。
 boolean isEnum()
          當且僅當該類聲明為源代碼中的枚舉時返回 true。
 boolean isInstance(Object obj)
          判定指定的 Object 是否與此 Class 所表示的對象賦值兼容。
 boolean isInterface()
          判定指定的 Class 對象是否表示一個接口類型。
 boolean isLocalClass()
          當且僅當底層類是本地類時返回 true
 boolean isMemberClass()
          當且僅當底層類是成員類時返回 true
 boolean isPrimitive()
          判定指定的 Class 對象是否表示一個基本類型。
 boolean isSynthetic()
          如果此類是復合類,則返回 true,否則 false
 T newInstance()
          創建此 Class 對象所表示的類的一個新實例。
 String toString()
          將對象轉換為字符串。

 

Field對象方法列表

 

 boolean equals(Object obj)
          將此 Field 與指定對象比較。
 Object get(Object obj)
          返回指定對象上此 Field 表示的字段的值。
<T extends Annotation>
T
getAnnotation(Class<T> annotationClass)
          如果存在該元素的指定類型的注釋,則返回這些注釋,否則返回 null。
 boolean getBoolean(Object obj)
          獲取一個靜態或實例 boolean 字段的值。
 byte getByte(Object obj)
          獲取一個靜態或實例 byte 字段的值。
 char getChar(Object obj)
          獲取 char 類型或另一個通過擴展轉換可以轉換為 char 類型的基本類型的靜態或實例字段的值。
 Annotation[] getDeclaredAnnotations()
          返回直接存在於此元素上的所有注釋。
 Class<?> getDeclaringClass()
          返回表示類或接口的 Class 對象,該類或接口聲明由此 Field 對象表示的字段。
 double getDouble(Object obj)
          獲取 double 類型或另一個通過擴展轉換可以轉換為 double 類型的基本類型的靜態或實例字段的值。
 float getFloat(Object obj)
          獲取 float 類型或另一個通過擴展轉換可以轉換為 float 類型的基本類型的靜態或實例字段的值。
 Type getGenericType()
          返回一個 Type 對象,它表示此 Field 對象所表示字段的聲明類型。
 int getInt(Object obj)
          獲取 int 類型或另一個通過擴展轉換可以轉換為 int 類型的基本類型的靜態或實例字段的值。
 long getLong(Object obj)
          獲取 long 類型或另一個通過擴展轉換可以轉換為 long 類型的基本類型的靜態或實例字段的值。
 int getModifiers()
          以整數形式返回由此 Field 對象表示的字段的 Java 語言修飾符。
 String getName()
          返回此 Field 對象表示的字段的名稱。
 short getShort(Object obj)
          獲取 short 類型或另一個通過擴展轉換可以轉換為 short 類型的基本類型的靜態或實例字段的值。
 Class<?> getType()
          返回一個 Class 對象,它標識了此 Field 對象所表示字段的聲明類型。
 int hashCode()
          返回該 Field 的哈希碼。
 boolean isEnumConstant()
          如果此字段表示枚舉類型的元素,則返回 true;否則返回 false
 boolean isSynthetic()
          如果此字段是復合字段,則返回 true;否則返回 false
 void set(Object obj, Object value)
          將指定對象變量上此 Field 對象表示的字段設置為指定的新值。
 void setBoolean(Object obj, boolean z)
          將字段的值設置為指定對象上的一個 boolean 值。
 void setByte(Object obj, byte b)
          將字段的值設置為指定對象上的一個 byte 值。
 void setChar(Object obj, char c)
          將字段的值設置為指定對象上的一個 char 值。
 void setDouble(Object obj, double d)
          將字段的值設置為指定對象上的一個 double 值。
 void setFloat(Object obj, float f)
          將字段的值設置為指定對象上的一個 float 值。
 void setInt(Object obj, int i)
          將字段的值設置為指定對象上的一個 int 值。
 void setLong(Object obj, long l)
          將字段的值設置為指定對象上的一個 long 值。
 void setShort(Object obj, short s)
          將字段的值設置為指定對象上的一個 short 值。
 String toGenericString()
          返回一個描述此 Field(包括其一般類型)的字符串。
 String toString()
          返回一個描述此 Field 的字符串。

 

Method對象方法列表

 

 boolean equals(Object obj)
          將此 Method 與指定對象進行比較。
<T extends Annotation>
T
getAnnotation(Class<T> annotationClass)
          如果存在該元素的指定類型的注釋,則返回這些注釋,否則返回 null。
 Annotation[] getDeclaredAnnotations()
          返回直接存在於此元素上的所有注釋。
 Class<?> getDeclaringClass()
          返回表示聲明由此 Method 對象表示的方法的類或接口的 Class 對象。
 Object getDefaultValue()
          返回由此 Method 實例表示的注釋成員的默認值。
 Class<?>[] getExceptionTypes()
          返回 Class 對象的數組,這些對象描述了聲明將此 Method 對象表示的底層方法拋出的異常類型。
 Type[] getGenericExceptionTypes()
          返回 Type 對象數組,這些對象描述了聲明由此 Method 對象拋出的異常。
 Type[] getGenericParameterTypes()
          按照聲明順序返回 Type 對象的數組,這些對象描述了此 Method 對象所表示的方法的形參類型的。
 Type getGenericReturnType()
          返回表示由此 Method 對象所表示方法的正式返回類型的 Type 對象。
 int getModifiers()
          以整數形式返回此 Method 對象所表示方法的 Java 語言修飾符。
 String getName()
          以 String 形式返回此 Method 對象表示的方法名稱。
 Annotation[][] getParameterAnnotations()
          返回表示按照聲明順序對此 Method 對象所表示方法的形參進行注釋的那個數組的數組。
 Class<?>[] getParameterTypes()
          按照聲明順序返回 Class 對象的數組,這些對象描述了此 Method 對象所表示的方法的形參類型。
 Class<?> getReturnType()
          返回一個 Class 對象,該對象描述了此 Method 對象所表示的方法的正式返回類型。
 TypeVariable<Method>[] getTypeParameters()
          返回 TypeVariable 對象的數組,這些對象描述了由 GenericDeclaration 對象表示的一般聲明按聲明順序來聲明的類型變量。
 int hashCode()
          返回此 Method 的哈希碼。
 Object invoke(Object obj, Object... args)
          對帶有指定參數的指定對象調用由此 Method 對象表示的底層方法。
 boolean isBridge()
          如果此方法是 bridge 方法,則返回 true;否則,返回 false
 boolean isSynthetic()
          如果此方法為復合方法,則返回 true;否則,返回 false
 boolean isVarArgs()
          如果將此方法聲明為帶有可變數量的參數,則返回 true;否則,返回 false
 String toGenericString()
          返回描述此 Method 的字符串,包括類型參數。
 String toString()
          返回描述此 Method 的字符串。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM