Java反射(一)

每天都要學習,堅持就是勝利

本篇博客對反射進行簡單介紹,用反射進行獲取對象的成員變量和函數,並進行操作,這些是後續操作的基礎


一、獲取類的方法、構造方法、屬性

  1. 獲取Class對象

    • 方式一:Class<?> class1 =Class.forName("com.guo.test.Person");
    • 方式二:Class<?> class1=Person.class;
    • 方式三:Person person=new Person(); Class<?> class1=person.getClass();
  2. 獲取Class對象的屬性

    Field[] allFields = class1.getDeclaredFields();//獲取class對象的所有屬性
    Field[] publicFields = class1.getFields();//獲取class對象的public屬性
    Field ageField = class1.getDeclaredField("age");//獲取class指定屬性
    Field desField = class1.getField("des");//獲取class指定的public屬性
  3. 獲取class對象的方法

    Method[] methods = class1.getDeclaredMethods();//獲取class對象的所有聲明方法
    Method[] allMethods = class1.getMethods();//獲取class對象的所有public方法 包括父類的方法
    Method method = class1.getMethod("info", String.class);//返回次Class對象對應類的、帶指定形參列表的public方法
    Method declaredMethod = class1.getDeclaredMethod("info", String.class);//返回次Class對象對應類的、帶指定形參列表的方法
  4. 獲取class對象的構造函數

    Constructor<?>[] allConstructors = class1.getDeclaredConstructors();//獲取class對象的所有聲明構造函數
    Constructor<?>[] publicConstructors = class1.getConstructors();//獲取class對象public構造函數
    Constructor<?> constructor = class1.getDeclaredConstructor(String.class);//獲取指定聲明構造函數
    Constructor publicConstructor = class1.getConstructor(String.class);//獲取指定聲明的public構造函數
  5. 其他方法

    Annotation[] annotations = (Annotation[]) class1.getAnnotations();//獲取class對象的所有註解
    Annotation annotation = (Annotation) class1.getAnnotation(Deprecated.class);//獲取class對象指定註解
    Type genericSuperclass = class1.getGenericSuperclass();//獲取class對象的直接超類的 Type
    Type[] interfaceTypes = class1.getGenericInterfaces();//獲取class對象的所有接口的type

二、操作對象

  1. 調用構造方法生成實例

    //第一種方式 Class對象調用newInstance()方法生成
    Object obj = class1.newInstance();
    //第二種方式 對象獲得對應的Constructor對象,再通過該Constructor對象的newInstance()方法生成
    Constructor<?> constructor = class1.getDeclaredConstructor(String.class);//獲取指定聲明構造函數
    obj = constructor.newInstance("hello");
  2. 調用類的方法

    // 生成新的對象:用newInstance()方法
    Object obj = class1.newInstance();
    //首先需要獲得與該方法對應的Method對象
    Method method = class1.getDeclaredMethod("setAge", int.class);
    //調用指定的函數並傳遞參數
    method.invoke(obj, 28);

    當通過Method的invoke()方法來調用對應的方法時,Java會要求程序必須有調用該方法的權限。如果程序確實需要調用某個對象的private方法,則可以先調用Method對象的如下方法。
    setAccessible(boolean flag):將Method對象的acessible設置爲指定的布爾值。值爲true,指示該Method在使用時應該取消Java語言的訪問權限檢查;值爲false,則知識該Method在使用時要實施Java語言的訪問權限檢查。

  3. 調用類的方法

    //生成新的對象:用newInstance()方法 
    Object obj = class1.newInstance();
    //獲取age成員變量
    Field field = class1.getField("age");
    //將obj對象的age的值設置爲10
    field.setInt(obj, 10);
    //獲取obj對象的age的值
    field.getInt(obj);
    • 通過Class對象的getFields()方法或者getField()方法獲得指定方法,返回Field數組或對象。

    • Field提供了兩組方法來讀取或設置成員變量的值:

    • getXXX(Object obj):獲取obj對象的該成員變量的值。此處的XXX對應8種基本類型。如果該成員變量的類型是引用類型,則取消get後面的XXX。

    • setXXX(Object obj,XXX val):將obj對象的該成員變量設置成val值。


先介紹這些,後續再詳細介紹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章