Reflection은 상위 클래스의 모든 필드를 포함하여 Java 클래스의 모든 필드를 가져옵니다. 클래스 자체의 필드는
getDeclaredFields() [모든 수정자 필드 가져오기] 또는 getFields() [공개 수정 필드 가져오기] 메서드를 통해 직접 가져올 수 있지만 상위 클래스의 필드를 가져올 수 있는 직접적인 방법은 없습니다.
재귀적으로 모든 상위 클래스를 가져온 다음 해당 필드를 가져와 마지막으로 클래스의 모든 필드를 가져와야 합니다.
필드 값을 얻으려면 필드에 액세스할 수 있도록 설정해야 합니다. field.setAccessible(true) 필드는 Reflect 패키지
1의 필드 클래스입니다.
2. 하위 클래스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;
}
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;
}
Reflection 객체는 문자열
코드로 바로 이동
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<Field> 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(); } }); } }
public class FanSeVo { private String name; private String id; //....... // 如果是跟外部程序或者接口对接的话,下面还可以加2个属性,一个是相互约定的秘钥,一个//是排除秘钥之后对属性和值做凭借之后的MD5加密之后的值,可以做数据安全考虑,防止传输过程数据被篡改 }
위 내용은 Java 리플렉션을 사용하여 객체 필드의 속성 값을 얻는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!