javajava反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明可用于微信支付 签名生成

Posted Angel挤一挤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javajava反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明可用于微信支付 签名生成相关的知识,希望对你有一定的参考价值。

方法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

 

运行结果:

 

以上是关于javajava反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明可用于微信支付 签名生成的主要内容,如果未能解决你的问题,请参考以下文章

java反射机制

java的反射 和 动态代理

java反射

Java中的动态反射机制和动态代理

java反射

Java基础(十三)反射