【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,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;
}
}
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;
} }
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;
} }
运行结果:

【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】的更多相关文章
- 反射学习2-通过反射机制动态获取属性的值模拟Struts的自动赋值
一.准备知识: Java反射机制 处理事务的JavaBean String的操作常用方法 二.模拟步骤 这里我们通过反射机制动态获取属性的值模拟Struts中的自动赋值. 1.首先创建 ...
- 通过java反射机制,获取对象的属性和值(包括所有继承的父类)
java的反射机制提供了两种方法: getDeclaredFields() :该方法能获取到本类的所有属性,包括private,protected和public,但不能获取到继承的父类的属性. get ...
- JAVA的反射机制原理
http://www.cnblogs.com/hongxinlaoking/p/4684652.html 一 反射机制的概念: 指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于 ...
- java笔录---反射机制(1)
引言 为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架, 像spring中核心模块IO ...
- java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值
1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...
- Java反射机制能够获取的信息,与应用
一.什么是Java反射机制? [1]反射机制是在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法: [2]对于任意一个对象,都能够调用它的任意一个属性和方法: 像这种动态获取类的信息以及动 ...
- Java反射机制(创建Class对象的三种方式)
1:SUN提供的反射机制的类: java.lang.Class<T> java.lang.reflect.Constructor<T> java.lang.reflect.Fi ...
- Java的反射机制和动态代理
介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大的功能,可以原 ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
随机推荐
- Linux学习前的准备
Linux学习前的准备 Linux的学习也是这次项目的一个点. 我的学习教材是 The Linux Command Line,这是本已经被翻译好了的 中英版本的教材,知识点还是比较入门的 我使用的是 ...
- java中从实体类中取值会忽略的的问题
在我们java Map中通过get来取值时会忽略的问题是:如果取得一个空值null时,那么.toString()时就会出错,而且不知道是什么原因. 现在我给的具体方法是用条件表达式先判断一下. 例: ...
- PAT 甲级 1011 World Cup Betting
https://pintia.cn/problem-sets/994805342720868352/problems/994805504927186944 With the 2010 FIFA Wor ...
- 华为手机怎么安装Google
华为手机怎么安装google 新买了个华为荣耀九,结果安装Google Play提示gms core 步骤一 gms 安装器.应用市场已经下架了 地址:链接: 点击打开链接 密码: m63j 步骤二 ...
- 【NOI 2015网络同步赛】
今年没法去.. 分数160+181+100(假设我有去考笔试)=441 分数线:金548 银459 铜331 并没有到银牌线.... 以后题目啊数据啊出来的话继续更新 2015.7.19
- 自定义View Draw过程(4)
目录 目录 1. 知识基础 具体请看我写的另外一篇文章:自定义View基础 - 最易懂的自定义View原理系列 2. draw过程作用 绘制View视图 3. draw过程详解 同measure.la ...
- 动态加载.so文件并执行类函数
背景:不同产品组将其功能编译为.so,这些.so 可以加载到统一的基础平台上运行,如果产品组代码有改动,只需要更新对应的.so 问题:如何动态加载.so文件,并使用里边的函数/类 ? 解决方法1: 使 ...
- V4L2 camera 驱动 capture测试程序【转】
转自:http://blog.csdn.net/kickxxx/article/details/6336346 在网上找了一个测试程序, 看了看,是根据capture.c修改的.测试步骤如下 . gc ...
- Video for Linux Two API Specification Revision 2.6.32【转】
转自:https://www.linuxtv.org/downloads/legacy/video4linux/API/V4L2_API/spec-single/v4l2.html Video for ...
- [转]Google gflags使用说明
gflags是什么: gflags是google的一个开源的处理命令行参数的库,使用c++开发,具备python接口,可以替代getopt. gflags使用起来比getopt方便,但是不支持参数的简 ...