>Java >java지도 시간 >Java 리플렉션을 사용하여 객체 필드의 속성 값을 얻는 방법은 무엇입니까?

Java 리플렉션을 사용하여 객체 필드의 속성 값을 얻는 방법은 무엇입니까?

王林
王林앞으로
2023-04-22 23:01:143711검색

Java 리플렉션은 필드 속성 값을 가져옵니다. ​

Reflection은 상위 클래스의 모든 필드를 포함하여 Java 클래스의 모든 필드를 가져옵니다. 클래스 자체의 필드는

getDeclaredFields() [모든 수정자 필드 가져오기] 또는 getFields() [공개 수정 필드 가져오기] 메서드를 통해 직접 가져올 수 있지만 상위 클래스의 필드를 가져올 수 있는 직접적인 방법은 없습니다.

재귀적으로 모든 상위 클래스를 가져온 다음 해당 필드를 가져와 마지막으로 클래스의 모든 필드를 가져와야 합니다.

필드 값을 얻으려면 필드에 액세스할 수 있도록 설정해야 합니다. field.setAccessible(true) 필드는 Reflect 패키지

Case

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;
}

3. 테스트 클래스, 학생 클래스의 모든 필드 가져오기

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;
}

4. 결과 출력

Java 리플렉션을 사용하여 객체 필드의 속성 값을 얻는 방법은 무엇입니까?Reflection 객체는 문자열

description

으로 속성과 값을 가져옵니다.

때때로 사용함 지나가는 객체를 kv 형태로 접합할 때 리플렉션을 사용하면 아주 좋습니다

코드로 바로 이동

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제