反射
獲取任意物件的資料
對物件一無所知的情況下
public class Student {
private String name;
private Integer age;
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
import java.lang.reflect.Field;
public class Main {
public static void main(String[] args) throws IllegalAccessException {
Student student = new Student("段昌峰", 25);
// 在未知物件情況的條件下,讀出物件的所有資料
// 獲取class類物件,這個物件中儲存了關於student物件的所有資訊
Class<? extends Student> aClass = student.getClass();
// 獲取class物件中的所有成員變數
Field[] fields = aClass.getDeclaredFields();
// 遍歷成員變數,首先把成員變數的可訪問性改為true
// 然後,透過getname和get方法獲取成員變數的名稱和值
for (Field field : fields) {
field.setAccessible(true);
System.out.println(field.getName()+"="+field.get(student));
}
}
}
透過配置檔案,建立物件並且呼叫方法
首先編寫配置檔案
className=Teacher
methodName=teach
其次編寫bean類
public class Teacher {
public Teacher() {
}
public void teach(){
System.out.println("老師正在教學");
}
}
最後編寫main函式中的方法
//讀取配置檔案
Properties p = new Properties();
FileInputStream fi = new FileInputStream("./pros.properties");
p.load(fi);
String className = (String) p.get("className");
String methodName = (String) p.get("methodName");
//首先根據全類名獲得class物件
Class<?> aClass = Class.forName(className);
//獲得構造方法
//並使用構造方法newinstance生成物件
Constructor<?> constructor = aClass.getDeclaredConstructor();
Object o = constructor.newInstance();
//獲得物件的對應方法
Method declaredMethod = aClass.getDeclaredMethod(methodName);
//透過invoke執行對應的方法
//invoke方法的引數列表分別是呼叫這個方法的物件和傳入的引數
declaredMethod.invoke(o);
以上程式碼可以實現根據配置檔案中的兩個字串,我們就可以生成這個物件,並且執行物件中的某個方法,以後我們就可以透過簡單的更改配置檔案來生成另一個物件,執行另一個方法。