java反射获取属性值

作者:原创时间:2022-03-09
文档

java反射获取属性值是怎样的呢?一起来看下吧:

反射获取Java类的所有字段,包括所有父类中的字段。类自身的字段可直接通过方法getDeclaredFields()(获取所有修饰符字段)或者getFields()(获取public修饰的字段)获取,但父类中的字段暂时没有发现直接获取的方式。 需要递归获取所有的父类,然后获取他们的字段,最终获取到类的所有字段。 

如果要获取字段值,则需要设置字段可访问:field.setAccessible(true);  field为reflect包下的Field类

案例:

1、父类

package com.carl.study.springboot.bean;
 
import lombok.Data;
import lombok.experimental.Accessors;
 
/**
 * @author changez
 * @desc
 * @date 2019/3/10 11:30
 */
@Data
@Accessors(chain = true)
public class BeanBasic {
 
 private Integer id;
 private Long createTime;
 private Long updateTime;
}

2、子类

package com.carl.study.springboot.bean;
 
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.experimental.Accessors;
 
/**
 * @author changez
 * @desc
 * @date 2019/3/10 11:17
 */
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Accessors(chain = true)
public class Student extends BeanBasic{
 
 private String name;
 private String address;
}

3、测试类

package test.lombok;
 
import com.carl.study.springboot.bean.Student;
import org.junit.Test;
 
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
/**
 * @author changez
 * @desc Java反射获取类的所有属性.
 * @date 2019/3/10 11:41
 */
public class LombokTest {
 
 @Test
 public void getParentField(){
  Student stu1 = new Student();
  stu1.setName("student-name")
   .setAddress("student1-address")
   .setId(1)
   .setCreateTime(20190310140423L)
   .setUpdateTime(20190310140423L)
  ;
 
  Class clazz = Student.class;
  List allFields = new ArrayList<>(100);
 
  // 获取当前对象的所有属性字段
  // clazz.getFields():获取public修饰的字段
  // clazz.getDeclaredFields(): 获取所有的字段包括private修饰的字段
  allFields.addAll(Arrays.asList(clazz.getDeclaredFields()));
 
  // 获取所有父类的字段, 父类中的字段需要逐级获取
  Class clazzSuper = clazz.getSuperclass();
 
  // 如果父类不是object,表明其继承的有其他类。 逐级获取所有父类的字段
  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();
   }
  });
 }
}

以上就是小编今天的分享,希望可以帮助到大家。

显示全文
vue 调用子组件方法 python的range函数用法 js set去重 vue使用jquery python skimage armoury crate打不开 java process deque java linux 格式化u盘 js读取文件 python 交集 object 转list object转bigdecimal java get和set方法 python中get函数用法 js set方法 mysql去重复 保留一条 rstudio使用教程 oracle coalesce python configparser模块 python中find函数的用法 getclass方法 python中strip函数的用法 js class类 mysql time类型 python中sorted函数的用法 cad的基本命令 ubuntu卸载mysql js获取随机数 opencv安装教程python python numpy教程 js获取日期 python tkinter教程 java reentrantlock c语言struct用法 字符转换成ascii码 js date加一天 vue动态绑定style spring boot mysql配置 python 排序算法