準備一個類,有參構造方法,字段,方法都是私有的
public class Cat {
private String name;
private Integer age;
private Cat(String name, Integer age) {
this.name = name;
this.age = age;
}
private void say() {
System.out.println("我是一隻貓");
}
@Override
public String toString() {
System.out.println("Cat{" +
"name='" + name + '\'' +
", age=" + age +
'}');
return "Cat{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
####通過反射獲取私有的構造方法
@Test
public void reflex1() throws Exception {
//獲取字節碼文件
Class<Cat> clazz = Cat.class;
//獲取參數第一個爲String類型和第二個爲Integer類型的構造方法
Constructor<Cat> constructor = clazz.getDeclaredConstructor(String.class, Integer.class);
//使用時取消 Java 語言訪問檢查
constructor.setAccessible(true);
//傳參
Cat cat = constructor.newInstance("咖菲貓", 10);
System.out.println(cat);
}
控制檯打印:
Cat{name=‘咖菲貓’, age=10}
####通過反射獲取類的字段並賦值
@Test
public void reflex2() throws Exception {
//獲取字節碼文件
Class<Cat> clazz = Cat.class;
//獲取參數第一個爲String類型和第二個爲Integer類型的構造方法
Constructor<Cat> constructor = clazz.getDeclaredConstructor();
//使用時取消 Java 語言訪問檢查
constructor.setAccessible(true);
//實例化對象
Cat cat = 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(cat, "咖菲貓");
}
if (field.getType().equals(Integer.class)) {
field.set(cat, 11);
}
}
System.out.println(cat);
}
控制檯打印:
字段名=name字段類型=class java.lang.String
字段名=age字段類型=class java.lang.Integer
Cat{name=‘咖菲貓’, age=11}
####通過反射獲取所用方法,並且調用
@Test
public void reflex3() throws Exception {
//獲取字節碼文件
Class<Cat> clazz = Cat.class;
//獲取參數第一個爲String類型和第二個爲Integer類型的構造方法
Constructor<Cat> constructor = clazz.getDeclaredConstructor();
//使用時取消 Java 語言訪問檢查
constructor.setAccessible(true);
//實例化對象
Cat cat = constructor.newInstance();
//獲取所有方法名 但不包括繼承的方法
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
System.out.println("方法名=" + method.getName());
//使用時取消 Java 語言訪問檢查
method.setAccessible(true);
//調用方法
method.invoke(cat);
}
}
控制檯打印:
方法名=toString
Cat{name=‘null’, age=null}
方法名=say
我是一隻貓