java反射获取类属性值,反射获取字段类型
目录
Java反射获取字段属性值案例反射对象获取属性和值凭借成线描述直接上代码
Java反射获取字段属性值
反射获取爪哇类的所有字段,包括所有父类中的字段。 类自身的字段可直接通过方法
getDeclaredFields()【获取所有修饰符字段】或者getFields()【获取公众的修饰的字段】获取, 但父类中的字段暂时没有发现直接获取的方式。
需要递归获取所有的父类, 然后获取他们的字段, 最终获取到类的所有字段。
如果要获取字段值, 则需要设置字段可访问即:字段。设置可访问性(true);领域为显示包下的田类
案例
1. 父类
包com。卡尔。学习。弹簧靴。豆;进口龙目岛。数据;导入龙目岛。实验性的。访问者;/* * * * @作者changez * @ desc * @ date 2019/3/10 11:30 */@数据@访问器(chain=true)公共类BeanBasic {私有整数id;私有长创建时间;私有长更新时间;}2. 子类
包com。卡尔。学习。弹簧靴。豆;进口龙目岛。数据;进口龙目岛EqualsAndHashCode。进口龙目岛ToString导入龙目岛。实验性的。访问者;/* * * * @作者changez * @ desc * @ date 2019/3/10 11:17 */@ Data @ EqualsAndHashCode(call super=true)@ ToString(call super=true)@ Accessors(chain=true)公共类学生扩展BeanBasic {私有字符串名称私有字符串地址;}3. 测试类,获取student类的所有字段
包test.lombok导入com。卡尔。学习。弹簧靴。比恩。学生;导入org。朱尼特。测试;导入Java。郎。反思。场;导入Java。util。ArrayList导入Java。util。数组;导入Java。util。列表;/* * * * @作者changez* @desc Java反射获取类的所有属性.* @ date 2019/3/10 11:41 */public class lombok Test { @ Test public void get parent field(){ Student stu 1=new Student();stu1.setName(学生名).setAddress(学生1-地址).setId(1).setCreateTime(20190310140423L).setUpdateTime(20190310140423 l);class clazz=student . class list field all fields=new ArrayList(100);//获取当前对象的所有属性字段//clazz.getFields():获取公众的修饰的字段//clazz.getDeclaredFields():获取所有的字段包括私人的修饰的字段所有字段。添加所有(数组。as列表(clazz。getdeclaredfields()));//获取所有父类的字段, 父类中的字段需要逐级获取class clazz super=clazz。get超类();//如果父类不是对象,表明其继承的有其他类。 逐级获取
所有父类的字段 while (clazzSuper != Object.class) { allFields.addAll(Arrays.asList(clazzSuper.getDeclaredFields())); clazzSuper = clazzSuper.getSuperclass(); } allFields.stream().forEach(field -> { // 设置字段可访问, 否则无法访问private修饰的变量值 field.setAccessible(true); try { // 获取字段名称 String fieldName = field.getName(); // 获取指定对象的当前字段的值 Object fieldVal = field.get(stu1); System.out.println(fieldName+"="+fieldVal); } catch (IllegalAccessException e) { e.printStackTrace(); } }); }}4. 结果输出
反射对象获取属性和值凭借成string
描述
有些时候会用到把穿过来的对象用kv的形式拼接这个时候用反射就很不错
直接上代码
public class FanSeVo { private String name; private String id; //....... // 如果是跟外部程序或者接口对接的话,下面还可以加2个属性,一个是相互约定的秘钥,一个//是排除秘钥之后对属性和值做凭借之后的MD5加密之后的值,可以做数据安全考虑,防止传输过程数据被篡改}
package com.ycj.my_all_demo.fanse;import java.lang.reflect.Field;import java.util.HashMap;/** * @author ycj * @data 17:55 */public class FanSe { public static void main(String[] args) { FanSeVo fanSeVo = new FanSeVo("1", "2"); Field[] fields = fanSeVo.getClass().getDeclaredFields(); HashMap<String, String> map = new HashMap<>(); for (Field field : fields) { field.setAccessible(true); try { // 把对象的属性做k,值做v // 当然中间还可做其他的业务操作,比如跳过某些属性什么的 String name = field.getName(); String s = field.get(fanSeVo).toString(); map.put(name,s); System.out.println(); } catch (Exception e) { e.printStackTrace(); } } // 吧map数据转成str,kv的形式 String strByMap = getStrByMap(map); System.out.println(strByMap);//name1id2 } public static String getStrByMap(HashMap<String, String> map){ StringBuilder str = new StringBuilder(); map.forEach((k,v)->{str.append(k).append(v);}); return str.toString(); }}
总结,其实反射也不难,遇到什么多写几遍就好了
以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。