反射


反射:动态创建对象的形式
反射能做什么:
通过类名能够得到有哪些字段 比如方法:<T> void showFields(Class<T> type)
通过类名能够创建一个新的对象,并为对应字段赋值
代码:Java版本
假如我们有一个 Person.class 类,如下:
import java.text.MessageFormat; public class Person{ private int id; private String name; public int getId() { return this.id; } public void setId(int id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } @Override public String toString() { return MessageFormat.format("id:{0},name:{1}", this.id,this.name); } }
根据类名获取所有字段
我们来实现 <T> void showFields(Class<T> type) 这个方法
public static <T> void showFields(Class<T> type) { Field[] fields = type.getDeclaredFields(); for (Field field : fields) { String name = field.getName(); Class<?> fieldType = field.getType(); print("name"); print(name); print("fileType"); print(fieldType); } } public static void print(Object obj) { System.out.println(obj); }
主要的方法是: getDeclaredFields() 方法,这个方法获取到 类 中的所有字段,包括 private 的。
返回的 Field 对象数组,再通过 Field 对象方法 getName 和 getType 来获取字段名字和字段类型即可。
调用 showFields(Person.class);
根据类名创建新对象
下面是根据 Person.class 来创建一个 Person 对象,id为1,name为tom
import java.lang.reflect.Field; public static <T> void newInstance(Class<T> type) throws InstantiationException, IllegalAccessException, Exception { T instance = type.newInstance(); Field[] fields = type.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); Class<?> fieldType = field.getType(); if(fieldType.equals(int.class) || fieldType.equals(Integer.class)) field.set(instance, Integer.parseInt("1")); else if(fieldType.equals(String.class)) field.set(instance,"tom"); else throw new Exception("不支持的filedtype"); } print(instance); }
这个通过 newInstance() 方法新建了一个实例,然后通过 字段 对象的 set(Object instance,Object value) 来对新建的对象赋值。
版权说明
作者:SQBER
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
{0}
{5}
{1}
{2}回复
{4}
*昵称:
*邮箱:
个人站点:
*想说的话: