獲取反射類的三種方法:
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());