import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//通过反射 动态地创建对象
public class TestCreat {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
//获取Class对象
Class aclass = Class.forName("cn.alan.reflection.part_05.Player");
//通过Class对象构造对象
//注:本质上调用了无参构造器 若无无参构造器将报错
Player player01 = (Player)aclass.newInstance();
//通过构造器构造对象
Constructor constructor = aclass.getDeclaredConstructor(int.class, int.class, String.class, String.class);
Player player02 = (Player) constructor.newInstance(1, 1, "123", "123456");
//通过反射调用方法
//注:不能直接调用私有方法 需要设置setAccessible(true) 即允许访问(关闭Java安全访问检测)
//注:setAccessible(true)可提高反射效率(若代码中必须使用反射且该代码需频繁被调用 建议setAccessible(true))
Player player03 = (Player)aclass.newInstance();
Method setName = aclass.getMethod("setUsername", String.class);
//通过invoke()方法来激活setName()方法
setName.invoke(player03, "player");
System.out.println("player03_username: " + player03.getUsername());
//通过反射调用属性
//注:不能直接调用私有属性 需要设置setAccessible(true) 即允许访问(关闭Java安全访问检测)
//注:setAccessible(true)可提高反射效率(若代码中必须使用反射且该代码需频繁被调用 建议setAccessible(true))
Player player04 = (Player)aclass.newInstance();
Field field = aclass.getDeclaredField("id");
field.set(player04, 1);
System.out.println("player04_id: " + player04.getId());
}
}
反射_动态创建对象
于 2022-08-08 00:18:16 首次发布