【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】-阿里云开发者社区

开发者社区> angel挤一挤> 正文

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

简介: 方法1:通过get()方法获取属性值   package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boole...
+关注继续查看

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

 

运行结果:

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
玩玩反射 - 刚写的一个动态获取属性值的例子
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ReflectionTest { public class Employee ...
624 0
Java反射获取对象中特定属性的值
Java反射获取对象中特定属性的值 问题一:如何找到某个对象中特定属性的值? public static Object getFieldValueByObject (Object object , String targetFieldName) throws Exception { ...
8844 0
了解超然物外的static-属性篇 | 带你学《Java面向对象编程》之十
本节通过传统类与使用static的类之间的比较,突出了static对于存储超大量重复性数据的优异表现。
920 0
+关注
angel挤一挤
【任何0基础都能看懂的步骤和解决方法!】
340
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载