准备工作,定义类
// 先定义类
import lombok.Data;
@Data
public class Hero {
String name;
Integer blood;
Integer hurt;
}
获取类对象有3种方式
// 获取类对象有3种方式
// Class heroClass = Hero.class;
// Class heroClass = Class.forName("com.wondream.myframework.app.basictest.reflection.Hero");
Class heroClass = new Hero().getClass();
Hero hero1 = (Hero) heroClass.newInstance();
hero1.setName("亚索");
hero1.setBlood(200);
hero1.setHurt(20);
System.out.println(hero1);
通过反射机制实例化对象
// 类对象
Class heroClass = Class.forName("com.wondream.myframework.app.basictest.reflection.Hero");
// 构造器
Constructor c1 = heroClass.getConstructor();
// 通过构造器实例化
Hero hero1 = (Hero) c1.newInstance();
通过反射机制访问属性
Class heroClass = new Hero().getClass();
Constructor c1 = heroClass.getConstructor();
Hero hero1 = (Hero) c1.newInstance();
// 获取属性
Field field = heroClass.getDeclaredField("name");
// 设置属性值
field.set(hero1, "亚索");
System.out.println(hero1.getName());
注意:
getField和getDeclaredField的区别
这两个方法都是用于获取字段
getField 只能获取public的,包括从父类继承来的字段。
getDeclaredField 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。 (注: 这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true))
通过反射调用方法
Class heroClass = Class.forName("com.wondream.myframework.app.basictest.reflection.Hero");
Constructor c1 = heroClass.getConstructor();
Hero hero1 = (Hero) c1.newInstance();
Field field = heroClass.getDeclaredField("name");
field.set(hero1, "亚索");
System.out.println(hero1.getName());
Method method = heroClass.getMethod("setName", String.class);
method.invoke(hero1, "打野");
System.out.println(hero1.getName());