使用java反射机制和json创建对象

int32位 posted @ Mar 28, 2014 03:47:31 PM in java , 3145 阅读
转载请注明:http://krystism.is-programmer.com/若有错误,请多多指正,谢谢!

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时非常有用。

转载请注明:http://krystism.is-programmer.com/若有错误,请多多指正,谢谢!
  • 无匹配
  • 无匹配

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter