小弟面試碰到一個比計較噁心的要求,就是一個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