java反射机制可以获取一个对象的所有属性以及其值,甚至可以改变其值,包括私有属性。利用这个特性可以使用json创建一个对象,尤其是java bean,非常方便。比如有一个对象有属性:id, name,有一个json对象{"id":"1000", "name" : "test"},通过反射机制可以很随意的创建一个和json对象值一样的对象,实现json对象和java对象转化。
首先需要获取一个对象的所有属性,注意到java Class对象方法getFields方法返回的是所有公共属性,包括父类和接口的属性,而getDeclaredFields()方法获取的是所有属性,包括私有属性,但不包含父类的属性。而要获取所有的包括父类的属性,没有现成的接口,于是自己写了个简单的,可能有问题,仅用于测试。
public static Set<Field> getFields(Object obj) { Set<Field> fields = new HashSet<Field>(); Class<? extends Object> cl = obj.getClass(); String objName = Object.class.getName(); while (!cl.getName().equals(objName)) { fields.addAll(Arrays.asList(cl.getDeclaredFields())); cl = cl.getSuperclass(); } return fields; }
获取了所有的属性后,就可以通过属性设置新的值,代码为:
public static boolean setValue(Object obj, Field field, Object value) { field.setAccessible(true); try { field.set(obj, value); } catch (IllegalArgumentException | IllegalAccessException e) { // fixed here } return true; }
于是整个通过json新建对象代码为(这里使用了org.json包):
public Entity(JSONObject entity) { Set<Field> fields = Reflect.getFields(this); for (Field field : fields) { String _field = field.getName(); if (entity.has(_field)) { Reflect.setValue(this, field, entity.get(_field)); } } }
通过遍历所有的属性以及Json对象中存在的键值,设置对象的值。这主要在初始化java bean时非常有用。