反射呼叫方法,例項化物件,欄位賦值
阿新 • • 發佈:2019-02-19
準備一個類,有參構造方法,欄位,方法都是私有的
public class Car {
private String name;
private Integer age;
private Car(String name, Integer age) {
this.name = name;
this.age = age;
}
private void say() {
System.out.println("我是一隻貓");
}
@Override
public String toString () {
System.out.println("Car{" +
"name='" + name + '\'' +
", age=" + age +
'}');
return "Car{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
通過反射獲取私有的構造方法
@Test
public void reflex1() throws Exception {
//獲取位元組碼檔案
Class<Car> clazz = Car.class;
//獲取引數第一個為String型別和第二個為Integer型別的構造方法
Constructor<Car> constructor = clazz.getDeclaredConstructor(String.class, Integer.class);
//使用時取消 Java 語言訪問檢查
constructor.setAccessible(true );
//傳參
Car car = constructor.newInstance("咖菲貓", 10);
System.out.println(car);
}
控制檯列印:
Car{name=’咖菲貓’, age=10}
通過反射獲取類的欄位並賦值
@Test
public void reflex2() throws Exception {
//獲取位元組碼檔案
Class<Car> clazz = Car.class;
//獲取引數第一個為String型別和第二個為Integer型別的構造方法
Constructor<Car> constructor = clazz.getDeclaredConstructor();
//使用時取消 Java 語言訪問檢查
constructor.setAccessible(true);
//例項化物件
Car car = constructor.newInstance();
//獲取所有欄位陣列
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
//列印欄位名和型別
System.out.println("欄位名=" + field.getName() + "欄位型別=" + field.getType());
field.setAccessible(true);
if (field.getType().equals(String.class)) {
field.set(car, "咖菲貓");
}
if (field.getType().equals(Integer.class)) {
field.set(car, 11);
}
}
System.out.println(car);
}
控制檯列印:
欄位名=name欄位型別=class java.lang.String
欄位名=age欄位型別=class java.lang.Integer
Car{name=’咖菲貓’, age=11}
通過反射獲取所用方法,並且呼叫
@Test
public void reflex3() throws Exception {
//獲取位元組碼檔案
Class<Car> clazz = Car.class;
//獲取引數第一個為String型別和第二個為Integer型別的構造方法
Constructor<Car> constructor = clazz.getDeclaredConstructor();
//使用時取消 Java 語言訪問檢查
constructor.setAccessible(true);
//例項化物件
Car car = constructor.newInstance();
//獲取所有方法名 但不包括繼承的方法
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
System.out.println("方法名=" + method.getName());
//使用時取消 Java 語言訪問檢查
method.setAccessible(true);
//呼叫方法
method.invoke(car);
}
}
控制檯列印:
方法名=toString
Car{name=’null’, age=null}
方法名=say
我是一隻貓