一、獲取Class對象的三種方式
public static void main(String[] args) throws ClassNotFoundException {
//第一種
Class clazz1 = Class.forName("com.lym.bean.Person");
//第二種
Class clazz2 = Person.class;
//第三種
Person p = new Person();
Class clazz3 = p.getClass();
}
二、通過配置文件獲取類名並通過無參構造創建類的實例(形如第一種方式)
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new FileReader("config.properties"));
Class clazz = Class.forName(br.readLine()); //獲取該類的字節碼文件
Person f = (Person) clazz.newInstance(); //創建實例對象
}
三、通過有參構造創建類的實例
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("com.lym.bean.Person");
Constructor c = clazz.getConstructor(String.class,int.class); //獲取有參構造
Person p = (Person) c.newInstance("張三",23); //通過有參構造創建對象
System.out.println(p);
}
四、獲取類中的指定字段
Class.getField(String)方法可以獲取類中的指定字段(可見的)
如果是私有的可以用getDeclaedField("name")方法獲取,然後調用setAccessible(true)設置訪問權限,再通過set(obj, "李四")方法可以設置指定對象上該字段的值,調用get(obj)可以獲取指定對象中該字段的值
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("com.lym.bean.Person");
Constructor c = clazz.getConstructor(String.class,int.class); //獲取有參構造
Person p = (Person) c.newInstance("張三",23); //通過有參構造創建對象
//Field f = clazz.getField("name"); //獲取姓名字段
//f.set(p, "李四");
// 修改姓名的值
Field f = clazz.getDeclaredField("name"); //暴力反射獲取字段
f.setAccessible(true); //去除私有權限
f.set(p, "李四");
System.out.println(p);
}
五、獲取類中的指定方法
Class.getMethod(String,Class...) 和 Class.getDeclaredMethod(String,Class...)方法可以獲取類中的指定方法,調用invoke(Object,Object...)可以調用該方法
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("com.lym.bean.Person");
Constructor c = clazz.getConstructor(String.class,int.class); //獲取有參構造
Person p = (Person) c.newInstance("張三",23); //通過有參構造創建對象
Method m = clazz.getMethod("eat"); //獲取eat方法
m.invoke(p);
Method m2 = clazz.getMethod("eat", int.class); //獲取有參的eat方法
m2.invoke(p, 10);
}