Java複習第12天---12.3---基礎加強---反射2
目錄
內容
1、class對象功能
常用功能分類
- 獲取功能
- 獲取構造器
- Constructor[] getConstructors() //獲取所有的公有構造器
- Constructor geConstructor(類<?>… parameterTypes) // 獲取指定的公有構造器
- Constructor[] getDeclaredConstructors() // 獲取所有訪問權限的構造器
- Constructor getDeclaredConstructor(類<?>… parameterTypes) // 獲取指定的構造器,訪問權限不限
- 獲取成員變量
- Field[] getFields()
- Field getField(String name) // 返回一個 Field對象,它反映此表示的類或接口的指定公共成員字段 類對象。
- Field[] getDeclaredFields()
- Field getDeclaredField(String name)
- 獲取方法
- Method[] getMethods()
- Method getMethod(String name, 類<?>… parameterTypes)
- Method[] getDeclaredMethods()
- Method getDeclaredMethod(String name, 類<?>… parameterTypes)
- 獲取類名
- String getName()
- 獲取構造器
2、獲取Constructor
這裏我們只演示public構造器的獲取,和創建對象。
-
示例2-1:
package reflect; public class Person { private String name; private int age; public Person() {} public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } } package reflect; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class TestReflectConstructor { public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Class<Person> cls = Person.class; // 1、獲取帶參構造器 Constructor<Person> c1 = cls.getConstructor(String.class, int.class); // 創建對象 Object obj1 = c1.newInstance("李四", 24); System.out.println(obj1); // 2、獲取無參構造器 Constructor<Person> c2 = cls.getConstructor(); // 創建對象 Object obj2 = c2.newInstance(); System.out.println(obj2); // 3、無參構造器創建對象 Object obj3 = cls.newInstance(); System.out.println(obj3); } } 測試結果: Person [name=李四, age=24] Person [name=null, age=0] Person [name=null, age=0]
3、獲取Field
package reflect;
import java.lang.reflect.Field;
public class TestReflectField {
public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
Class<Person> cls = Person.class;
// 1、getFields
Field[] f1 = cls.getFields();
for(Field f: f1) {
System.out.println(f);
}
System.out.println("========");
// 2、getDeclaredFields
Field[] f2 = cls.getDeclaredFields();
for(Field f: f2) {
System.out.println(f);
}
System.out.println("========");
// 3、getField(String name)
Field f3 = cls.getDeclaredField("name");
f3.setAccessible(true);
Person p = new Person();
f3.set(p, "王五");
Object obj3 = f3.get(p);
System.out.println(obj3);
}
}
- 分析:
- 想要獲取非公有的屬性,需要加declared
- set,get爲設置和獲取屬性的值
- 想要使用非公有的屬性,需要調用setAccessible(true)方法
4、獲取Method
這裏只演示公有帶參成員方法的獲取和使用
-
示例4-1:
package reflect; public class Person { private String name; private int age; public int a; protected int b; int c; public Person() {} public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } public void eat(String food) { System.out.println(" eat " + food); } } package reflect; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class TestReflectMethod { public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Class<Person> cls = Person.class; Method eat = cls.getMethod("eat", String.class); Person p = new Person(); eat.invoke(p, "饅頭"); } } 測試結果: eat 饅頭
5、案例
-
需求:創建任務類型的對象,執行該對象的任意無參方法
-
分析:
- 配置文件:配置全類名,配置方法名
- 通過Properties讀取配置
- 利用反射創建對象並執行方法
-
代碼5-1:
package reflect; public class Person { private String name; private int age; public int a; protected int b; int c; public Person() {} public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } public void eat(String food) { System.out.println(" eat " + food); } public void eat() { System.out.println("喫東西"); } } package reflect; import java.lang.reflect.Method; import java.util.Properties; public class TestReflect { public static void main(String[] args) throws Exception{ ClassLoader cl = TestReflect.class.getClassLoader(); Properties prop = new Properties(); prop.load(cl.getResourceAsStream("instance.properties")); String className = prop.getProperty("className"); String methodName = prop.getProperty("methodName"); Class cls = Class.forName(className); Method method = cls.getDeclaredMethod(methodName); Object obj = cls.newInstance(); method.invoke(obj, null); // } } instance.properties 配置文件內容: className=reflect.Person methodName=eat 測試結果: 喫東西
執行帶參方法可以自己研究下,暫時沒研究。
後記 :
本項目爲參考某馬視頻開發,相關視頻及配套資料可自行度娘或者聯繫本人。上面爲自己編寫的開發文檔,持續更新。歡迎交流,本人QQ:806797785
前端項目源代碼地址:https://gitee.com/gaogzhen/vue-leyou
後端JAVA源代碼地址:https://gitee.com/gaogzhen/JAVA