每天都要學習,堅持就是勝利
本篇博客對反射進行簡單介紹,用反射進行獲取對象的成員變量和函數,並進行操作,這些是後續操作的基礎
一、獲取類的方法、構造方法、屬性
獲取Class對象
- 方式一:
Class<?> class1 =Class.forName("com.guo.test.Person");
- 方式二:
Class<?> class1=Person.class;
- 方式三:
Person person=new Person(); Class<?> class1=person.getClass();
- 方式一:
獲取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屬性
獲取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對象對應類的、帶指定形參列表的方法
獲取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構造函數
其他方法
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集
二、操作對象
調用構造方法生成實例
//第一種方式 Class對象調用newInstance()方法生成 Object obj = class1.newInstance(); //第二種方式 對象獲得對應的Constructor對象,再通過該Constructor對象的newInstance()方法生成 Constructor<?> constructor = class1.getDeclaredConstructor(String.class);//獲取指定聲明構造函數 obj = constructor.newInstance("hello");
調用類的方法
// 生成新的對象:用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語言的訪問權限檢查。調用類的方法
//生成新的對象:用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值。
先介紹這些,後續再詳細介紹。