准备一个类,有参构造方法,字段,方法都是私有的
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 我是一只猫