1. 程式人生 > >【java】java反射機制,動態獲取對象的屬性和對應的參數值,並屬性按照字典序排序,Field.setAccessible()方法的說明【可用於微信支付 簽名生成】

【java】java反射機制,動態獲取對象的屬性和對應的參數值,並屬性按照字典序排序,Field.setAccessible()方法的說明【可用於微信支付 簽名生成】

modifier 直接 this 字段值 1-1 讓我 toupper ima play

方法1:通過get()方法獲取屬性值

技術分享
package com.sxd.test.controller;

public  class FirstCa{
     private Integer num;
     private String name;
     private Boolean flag;
     
     
    public Integer getNum() {
        return num;
    }
    public void setNum(Integer num) {
        this.num = num;
    }
    public
String getName() { return name; } public void setName(String name) { this.name = name; } public Boolean getFlag() { return flag; } public void setFlag(Boolean flag) { this.flag = flag; } }
View Code 技術分享
package com.sxd.test.controller;

import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class Test { @org.junit.Test public void testName() throws Exception { FirstCa ca = new FirstCa(); ca.setFlag(
true); ca.setNum(30); Map<String,String> map = getSortMap(ca); map.forEach((k,v)->{ System.out.println(k+">>>"+v); }); } /** * 使用java反射機制,動態獲取對象的屬性和參數值,排除值為null的情況,並按字典序排序 * @param object * @return * @throws Exception */ private Map<String, String> getSortMap(Object object) throws Exception{ Field[] fields = object.getClass().getDeclaredFields(); Map<String, String> map = new HashMap<String, String>(); //叠代屬性 for(Field field : fields){ String name = field.getName(); String methodName = "get" + name.replaceFirst(name.substring(0, 1), name.substring(0, 1) .toUpperCase()); // 調用getter方法獲取屬性值 // Method getter = object.getClass().getMethod(methodName); // String value = getter.invoke(object)+""; //通過get方法直接獲取屬性值 field.setAccessible(true); Object value = field.get(object); if (value != null){ map.put(name, value.toString()); } System.out.println("字段名:"+name); System.out.println("字段值:"+field.get(object)); System.out.println("字段java語言修飾符:"+field.getModifiers()); System.out.println("字段類型:"+field.getType()); System.out.println(""); } Map<String, String> sortMap = new TreeMap<String, String>( new Comparator<String>() { @Override public int compare(String arg0, String arg1) { return arg0.compareTo(arg1); } }); sortMap.putAll(map); return sortMap; } }
View Code

Field.setAccessible(true);得作用就是讓我們在用反射時訪問私有變量

運行結果:

技術分享

方法2: 通過屬性自己的getter方法獲取屬性值

技術分享
package com.sxd.test.controller;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Test {

    
    
    @org.junit.Test
    public void testName() throws Exception {
        FirstCa  ca = new FirstCa();
        ca.setFlag(true);
        ca.setNum(30);
        
        Map<String,String> map = getSortMap(ca);
        map.forEach((k,v)->{
            System.out.println(k+">>>"+v);
        });
    }
    
     /**
      * 使用java反射機制,動態獲取對象的屬性和參數值,排除值為null的情況,並按字典序排序
      * @param object
      * @return
      * @throws Exception
      */
     private Map<String, String> getSortMap(Object object) throws Exception{
            Field[] fields = object.getClass().getDeclaredFields();
            Map<String, String> map = new HashMap<String, String>();
            //叠代屬性 
            for(Field field : fields){
                 String name = field.getName();
                 String methodName = "get" + name.replaceFirst(name.substring(0, 1), name.substring(0, 1)
                         .toUpperCase());
                 // 調用getter方法獲取屬性值
                 Method getter = object.getClass().getMethod(methodName);
                 String value =  getter.invoke(object)+"";
                 
                 //通過get方法直接獲取屬性值
//                 field.setAccessible(true);
//                 Object value = field.get(object);
                 if (value != null && !"null".equals(value)){
                     map.put(name, value);
                 }
                 System.out.println("字段名:"+name);
                 System.out.println("字段值:"+value);
                 System.out.println("字段java語言修飾符:"+field.getModifiers());
                 System.out.println("字段類型:"+field.getType());
                 System.out.println("");
            }

            Map<String, String> sortMap = new TreeMap<String, String>(
                    new Comparator<String>() {

                        @Override
                        public int compare(String arg0, String arg1) {
                           
                            return arg0.compareTo(arg1);
                        }
                    });
            sortMap.putAll(map);
            return sortMap;
        }
    
}
View Code

運行結果:

技術分享

【java】java反射機制,動態獲取對象的屬性和對應的參數值,並屬性按照字典序排序,Field.setAccessible()方法的說明【可用於微信支付 簽名生成】