反射

獲取反射類的三種方法:

1.? Class.forName("類所在的包和類名");

Class class1 = Class.forName("com.qfedu.a_reflect.Person");

2:類名.class

Class class2 = Person.class;

3.:對象.getClass();

Class class3 = new Person(1,"jugg").getClass();

通過反射獲取構(gòu)造方法

1.獲取所有的public構(gòu)造方法

Constructor[] constructors = cls.getConstructors();

2.獲取包括私有化的所有構(gòu)造方法

Constructor[] allConstructors = cls.getDeclaredConstructors();

3.通過參數(shù),獲取指定的構(gòu)造方法

Constructor aConstructor = cls.getConstructor(int.class, String.class);

4.通過參數(shù),獲取指定的構(gòu)造方法(包括私有的)

Constructor privateConstructor = cls.getDeclaredConstructor(null);

5.反射后,通過構(gòu)造方法,創(chuàng)建對象。如果是私有化構(gòu)造方法,要給予操作權(quán)限。

privateConstructor.setAccessible(true);

Person p2 = (Person) privateConstructor.newInstance(null);

p2.setId(2);

p2.setName("劉德華");

System.out.println(p2);

通過反射,獲取方法

Class cls = Class.forName("com.qfedu.a_reflect.Person");

Person p = (Person) cls.getConstructor(int.class, String.class).

newInstance(1, "狗蛋");

1.獲取所有非私有化的方法,包括從父類中繼承的

Method[] allPublicMethods = cls.getMethods();

2.獲取私有化在內(nèi)的所有方法,過濾掉繼承的方法

Method[] allMethods = cls.getDeclaredMethods();

3.獲取指定的方法(非私有化)

Method aPublicMethod = cls.getMethod("sleep", int.class);

獲取后,方法的使用:

aPublicMethod.invoke(p, 15);

4.獲取指定的方法(包括私有化,使用的時候要授權(quán))

Method aPrivateMethod = cls.getDeclaredMethod("testPrivate", null);

aPrivateMethod.setAccessible(true);

aPrivateMethod.invoke(p, null);

5.獲取一個靜態(tài)方法

Method aPublicStaticMethod = cls.getMethod("eat", null);

aPublicStaticMethod.invoke(null, null);

反射,獲取字段

//加載字節(jié)碼文件,獲取Class類對象

Class cls = Class.forName("com.qfedu.a_reflect.Person");

1.獲取所有用public修飾的成員變量

Field[] allPublicFields = cls.getFields();

2.暴力反射,獲取私有化在內(nèi)的成員變量

Field[] allFields = cls.getDeclaredFields();

3.獲取指定的字段(非私有化)

Field aPublicField = cls.getField("test");

//通過set方法,對對象進行賦值

//set(Oject obj, Object value);

//第一個參數(shù): 要操作的是哪一個對象里面的成員變量

//第二個參數(shù): 需要設(shè)置的值

Person p = (Person) cls.getConstructor(int.class, String.class).

newInstance(1, "狗蛋");

aPublicField.set(p, 20);

System.out.println(p.test);

4.獲取靜態(tài)的字段

Field aStaticField = cls.getField("testStatic");

int num = aStaticField.getInt(cls);

System.out.println("獲取int的靜態(tài)字段值,轉(zhuǎn)化為int的令一個原始類型的值" + num);

System.out.println(aStaticField);

aStaticField.set(null, 20);

System.out.println(Person.testStatic);

5.獲取私有化的指定字段,使用時要授權(quán)

Field aPrivateField = cls.getDeclaredField("id");

System.out.println(aPrivateField);

aPrivateField.setAccessible(true);

aPrivateField.set(p, 10);

System.out.println(p.getId());

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 學習Android的同學注意了?。?!學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Android學習交流群...
    kingZXY2009閱讀 356評論 0 0
  • Java Reflect 反射機制 類字節(jié)碼文件是在硬盤上存儲的,是一個個的.class文件。我們在new一個對象...
    灰氣球閱讀 1,250評論 0 0
  • java中反射是通過一定的條件得到類對象然后進行各種操作的過程; 反射有可以分為幾個層次; 1 得到類對象 2. ...
    知足_71be閱讀 278評論 0 0
  • 敗走麥城 梨花海 2008-3-30 敗走麥城 ---不靈的仙兒 我小心翼翼 屏住呼吸 我全心全意 控制情緒 我惶...
    椏緹閱讀 437評論 0 0
  • 一些詞,比如堅持,比如努力,聽上去就很吃力,所以很厭煩。 真的發(fā)現(xiàn),原來有些東西,不是我們所謂的不堅持就成功不了,...
    奉旨生活閱讀 655評論 0 1

友情鏈接更多精彩內(nèi)容