反射都是通过类模板对对象进行操作的, 此处可以看到 第一篇笔记中说的: 先找到模块, 然后根据对象进行操作。 测试前, 请自行创建 UserEntity 对象;
package devi.mint.reflect;
import devi.mint.entity.UserEntity;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 反射技术探索
* 生成并操作对象
*/
public class ReflectCreatUseObject {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
//通过反射生成对象(获取对象的4中方式: new,反射,克隆,反序列化)
System.out.println("===============通过反射生成对象=================");
Class<UserEntity> userEntityClass = UserEntity.class;
//获取参构造器
Constructor<UserEntity> constructor = userEntityClass.getDeclaredConstructor();
Constructor<UserEntity> constructor2 = userEntityClass.getDeclaredConstructor(int.class, String.class, int.class);
//根据构造器创建对象
UserEntity user = constructor.newInstance();
UserEntity user2 = constructor2.newInstance(1, "张三", 18);
System.out.println("user = " + user);
System.out.println("user2 = " + user2);
System.out.println("===============通过反射给对象属性赋值(private 属性不能直接通过反射赋值)=================");
Field fieldName = userEntityClass.getField("name");
fieldName.set(user, "李四");
System.out.println("user = " + user);
System.out.println("===============通过反射给对象属性取值=================");
System.out.println("user 对象的 name: " + fieldName.get(user));
System.out.println("===============通过反射调用方法(私有属性的赋值需要如此)=================");
Method setAge = userEntityClass.getMethod("setAge", int.class);
setAge.invoke(user, 22);
System.out.println(user);
}
}