通過反射擷取類的基本資訊,建立對象并進行相應的設定。
public class Demo02 {
@SuppressWarnings("all")
public static void main(String[] args) throws Exception {
// 另一個com.sg.myReflection.bean包下的User類
String path = "com.sg.myReflection.bean.User";
try {
Class clazz = Class.forName(path);
// 擷取類名
String strName01 = clazz.getName();// 擷取完整類名com.sg.myReflection.bean.User
String strName02 = clazz.getSimpleName();// 直接擷取類名 User
// 擷取屬性
Field[] field01 = clazz.getFields(); // 傳回屬性為public的字段
Field[] field02 = clazz.getDeclaredFields(); // 傳回所有的屬性
Field field03 = clazz.getDeclaredField("id"); // 擷取屬性為id的字段
// 擷取普通方法
Method[] Method01 = clazz.getDeclaredMethods(); // 傳回public方法
Method method = clazz.getDeclaredMethod("getId", null); // 傳回getId這個方法,如果沒有參數,就預設為null
// 擷取構造方法
User u1 = (User) clazz.newInstance(); // 擷取無參的構造函數這裡的前提的保證類中應該有無參的構造函數
// 擷取參數為(int,String,int)的構造函數
Constructor c2 = clazz.getDeclaredConstructor(int.class, String.class, int.class);
// 通過有參構造函數建立對象
User u2 = (User) c2.newInstance(1001, "小小", 18);
// 通過反射調用普通方法
User u3 = (User) clazz.newInstance();
Method method03 = clazz.getDeclaredMethod("setId", int.class);
method.invoke(u3, 1002); // 把對象u3的id設定為1002
// 通過反射操作普通的屬性
User u4 = (User) clazz.newInstance();
Field f = clazz.getDeclaredField("name");
f.setAccessible(true); // 設定屬性可以直接的進行通路
f.set(u4, "石頭");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
程式中用到的User類:
public class User {
// 學号
public int id;
// 名字
String name;
// 年齡
int age;
public User() {
super();
}
public User(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
}