小弟面试碰到一个比计较恶心的要求,就是一个javaBean 可能有10个属性,转成json后通常也会有10个键值对,无论是否是null都会存在。现要求 转成json后 只能有3个有值的属性。怎么搞?java
我想到的就是反射面试
package com.wisely; import net.sf.json.JSONObject; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; /** * DES: 将非null 的属性,转成json null的属性,在json中看不到 * Created by Reynole-白 * Date: 2017/8/29 16:37 */ public class TestClass { private String name; private String sex; private int age; private String adress; public String getAdress() { return adress; } public void setAdress(String adress) { this.adress = adress; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String sysMsg(){ return "我是sysMsg方法"; } public static void main(String[] args) throws Exception { TestClass testClass = new TestClass(); testClass.setName("i am TestClass class"); testClass.setAge(10); testClass.setSex("girl"); Class<TestClass> cl = (Class<TestClass>) testClass.getClass(); Field[] fields = cl.getDeclaredFields(); System.out.println(fields.length); //来一个map 用于转换成json用 Map<String,String> key_value = new HashMap<String,String>(); for(Field field : fields){ Object object = getValueByFieldName(field.getName(),testClass); if(null != object){ System.out.println(object.toString()); //将key-value 添加到map key_value.put(field.getName(),object.toString()); } } JSONObject json = JSONObject.fromObject(key_value); System.out.println(json.toString()); } public static Object getValueByFieldName(String fieldName,Object object) throws Exception { //通常get方法属性名开头字母都大写 String firstLetter = fieldName.substring(0, 1).toUpperCase(); //拼接成getter方法名 String getter = "get" + firstLetter + fieldName.substring(1); //获取对应get方法下面两个方法使用哪一个都行 Method method = object.getClass().getMethod(getter,null); // Method method = object.getClass().getMethod(getter,new Class[]{}); //执行该get方法,后面的参数给一个空就行 Object value = method.invoke(object,null); // method.invoke(object,new Object[]{}); return value; } }
其,主要思路就是:json
获取bean 的class对象,而后获取到全部的属性。this
根据get方法的命名规则,使用Field对象的getName方法拼接处get方法的名称。code
根据class对象和 get方法的名称 获取到对应get方法的method方法对象,调用该method方法的invoke方法执行get方法,获取指定field的值对象
封装到map中,转成json便可。get
若是要想随机将指定个数的属性封装成json,那么就要在遍历Fields时,就要随机取,在取出对应的value便可。string