反射直接设置pojo类的值,pojo转json,json转pojo

属性的直接访问

直接访问设置好的pojo类

package my;

import java.lang.reflect.Type;

import af.test.Example;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Test3
{
	public static void main(String[] args) throws Exception
	{
		//从example.jar中加载一个类
		Class cls = Class.forName("my.Student");
		//创建一个实例
		Object obj = cls.newInstance();
		
		//获取字段名
		Field idField = cls.getDeclaredField("id");
		Field nameField = cls.getDeclaredField("name");
		
		// 示例:取得修饰符,判断是否为 public
		int mod = idField.getModifiers();
		if(Modifier.isPublic(mod))
		{
			//相对于  id.set(20190001)
			idField.set(obj, 20190001);
		}
		
		//相对于  name.set(20190001)
		nameField.set(obj, "xiaoming");
		
		int id = (int) idField.get(obj);
		
		// obj.getName();
		String name = (String) nameField.get(obj);
		
		System.out.println("** 学号:" + id + ",姓名:" + name);
	}
}                                      

pojo转json

package my_0505_特殊类型处理;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.json.JSONObject;

public class Util
{
	public static JSONObject pojo2JSON (Object obj) throws Exception
	{
		// 获取Class信息
		Class cls = obj.getClass();
		
		// 取得所有属性的描述
		Field[] fields = cls.getDeclaredFields();
		
		// 结果为一个JSONObject
		JSONObject json = new JSONObject();
	
		// 从 obj 中取出所有的属性值,放到 json 里
		for(Field f : fields)
		{
			// 属性名
			String name = f.getName();
			
			// 换算出 Getter的名字 ,例如 cellphone -> getCellphone()
			String getterName = getterName(name);
			
			// 取得 Getter 方法, 如果 Getter方法不存在,则抛出异常
			Method getter = cls.getDeclaredMethod(getterName);
			
			// 调用 Getter 方法,得到属性的值 
			// 注意: Getter方法不带参数,无需传参
			// 类比一下普通方式: String cellphone = stu.getCellphone() 
			Object value = getter.invoke(obj);
			
			// 存到json中
			json.put(name, value);
		}
		return json;
	}
	
	public static String getterName(String field)
	{
		// name -> getName
		Character firstChar = Character.toUpperCase(field.charAt(0));
		StringBuffer strbuf = new StringBuffer("get" + field);
		strbuf.setCharAt(3, firstChar);
		return strbuf.toString();
	}
}

json转pojo

package my;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.json.JSONObject;

public class Util
{
	//JSON -> POJO
	public static Object json2POJO (JSONObject json, Class pojoClass) throws Exception
	{
		//取得所有属性的描述
		Field[] fields = pojoClass.getDeclaredFields();
		
		//结果为一个Object
		Object pojo = pojoClass.newInstance();
		
		//从 obj 中取得所有的属性值
		for(Field f : fields)
		{
			//属性名
			String name = f.getName();
			
			//字段类型,与setter的参数类型相同
			Class argType = f.getType();
			
			// 换算出setter的名字, 例如 name -> setName()
			String setterName = setterName(name);
			
			//找到Setter
			Method setter = pojoClass.getDeclaredMethod(setterName, argType);
			
			//参数的值
			Object argValue = null;
			if(argType.equals(int.class) || argType.equals(Integer.class))
				argValue = json.optInt(name, 0);
			else if(argType.equals(long.class) || argType.equals(Long.class))
				argValue = json.optLong(name, 0L);
			else if(argType.equals(short.class) || argType.equals(Short.class))
				argValue = (short) json.optInt(name,0);
			else if(argType.equals(byte.class) || argType.equals(Byte.class))
				argValue = (byte) json.optInt(name,0);
			else if(argType.equals(double.class) || argType.equals(Double.class))
				argValue = json.optDouble(name,0);	
			else if(argType.equals(float.class) || argType.equals(Float.class))
				argValue = json.optFloat(name,0);
			else if(argType.equals(boolean.class) || argType.equals(Boolean.class))
				argValue = json.optBoolean(name,true);	
			else if(argType.equals(String.class))
				argValue = json.optString(name,"");	
			// 其他类型,如Date,Timestamp类型,暂不处理
			
			// 
			setter.invoke(pojo, argValue);
		}
		return pojo;
	}
	
	public static  String setterName(String field)
	{
		// "name" -> "setName()"
		char firstChar = Character.toUpperCase(field.charAt(0));
		StringBuffer strbuf = new StringBuffer("get" + field);
		strbuf.setCharAt(3, firstChar);
		return strbuf.toString();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值