没写到的地方下次一定补
package com.haojinhui2.fanshe;
public class Animal {
private String name;
public int age;
public Animal() {
}
private Animal(String name, int age) {
this.name = name;
this.age = age;
}
private void Method() {
System.out.println("私有方法");
}
public void Method2(String name) {
System.out.println("公开方法" + ", " + name);
}
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
package com.haojinhui2.fanshe;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test3 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
// 拿到Animal类的字节码文件对象
Class<Animal> c = Animal.class;
// Class<? extends Animal> c2 = new Animal().getClass();
// Class<?> c3 = Class.forName("com.haojinhui2.fanshe.Animal");
// class com.haojinhui2.fanshe.Animal
// 拿到构造器
Constructor<Animal> con = c.getDeclaredConstructor();
Animal ani = con.newInstance();
// Animal{name='null', age=0}
// Animal ani2 = con.newInstance(String.class, int.class);
// 不对,下次补
// 拿到成员变量
Field name = c.getDeclaredField("name");
// private java.lang.String com.haojinhui2.fanshe.Animal.name
Field age = c.getDeclaredField("age");
// public int com.haojinhui2.fanshe.Animal.age
// 设置对象属性
name.setAccessible(true); // 设置私有属性为可访问
name.set(ani, "小猫");
age.set(ani, 6);
// Animal{name='小猫', age=6}
// 拿到对象方法
Method met = c.getDeclaredMethod("Method");
met.setAccessible(true); // 私有设为可访问
met.invoke(ani);
// 私有方法
Method method2 = c.getDeclaredMethod("Method2", String.class);
method2.invoke(ani, "小狗");
// 公开方法, 小狗
}
}