目标
- 认识类加载流程
- 认识反射
- 如何通过反射创建对象
知识点
类加载机制:
- 因为类加载流程是:
- Class文件中包含的内容
一般情况下创建对象是通过正向创建,也就是提前知道创建那个类,之后对其进行实例化。
Apple apple = new Apple();
反射就是开始时并不知道需要创建的是什么对象,所以无法通过new进行创建,必须通过JDK提供的方法进行所谓的反射创建对象
反射概念:
反射就是在程序编译时,程序猿并不知道用户所要创建的对象是什么?只有当用户调用时候(程序运行中)才能确定所传入的类是什么,通过获取类的信息进行创建对象,并调用。
常用的通过反射获取Class对象的方式:
- 使用Class.forName()
Class clazz = Class.forName("类全路径");
- 使用.class方式(需要提前知道所传入的类是什么)
Class clazz = Person.class;
- 使用类对象的getClass()方法
Person person = new Person();
Class clazz = person.getClass();
通过反射创建对象
- 通过Class对象newInstance()方法
Person person = (Person) clazz.newInstance();
- 通过Constructor对象的newInstance()方法
Constructor<?> constructor = clazz.getConstructor();
//这里调用无参构造方法
Person person =(Person) constructor.newInstance();
通过反射获取类的属性,方法,构造器等
Class<Person> personClass = Person.class;
//这里通常属性是私有属性,如果使用getFields()只能获取共有属性public
Field[] fields = personClass.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName());
System.out.println(field.getType());
}
//通过反射构建对象
Constructor<?> constructor = aClass.getConstructor(Integer.class, String.class);
Person person = (Person) constructor.newInstance(1, "名称");
System.out.println(JSONUtil.toJsonStr(person));
通过反射自定义BeanUtil工具类
public static void copyProperties(Object source, Object target){
try {
Field[] sourceFields = source.getClass().getDeclaredFields();
Field[] targetFields = target.getClass().getDeclaredFields();
for (Field field : sourceFields) {
for (Field targetField : targetFields) {
if ( field.getName().equals(targetField.getName())
&& field.getType().equals(targetField.getType()) ){
field.setAccessible(true);
Object value = field.get(source);
if (null == value || value.equals("")){
continue;
}
targetField.setAccessible(true);
targetField.set(target, value );
}
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}