Rumah  >  Artikel  >  Java  >  Bagaimana untuk mendapatkan nilai harta medan objek menggunakan refleksi Java?

Bagaimana untuk mendapatkan nilai harta medan objek menggunakan refleksi Java?

王林
王林ke hadapan
2023-04-22 23:01:143672semak imbas

Refleksi Java mendapat nilai atribut medan

Reflection mendapat semua medan kelas Java, termasuk semua medan dalam kelas induk. Medan kelas itu sendiri boleh diperoleh secara langsung melalui kaedah

getDeclaredFields() [dapatkan semua medan pengubah suai] atau getFields() [dapatkan medan diubah suai awam], tetapi tiada cara langsung untuk mendapatkan medan dalam kelas ibu bapa.

Anda perlu mendapatkan semua kelas induk secara rekursif, kemudian mendapatkan medannya dan akhirnya memperoleh semua medan kelas.

Jika anda ingin mendapatkan nilai medan, anda perlu menetapkan medan untuk boleh diakses: field.setAccessible(true); >

1. Kelas ibu bapa

2 semua bidang kelas pelajar
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;
}

4. Output hasil
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;
}

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();
            }
        });
    }
}
Objek pantulan memperoleh atribut dan nilai. ​​​​ke dalam rentetan

Penerangan

Kadang-kadang perlu untuk menyambung objek yang melintas dalam bentuk kv Dalam kes ini, adalah sangat baik untuk menggunakan pantulan

Bagaimana untuk mendapatkan nilai harta medan objek menggunakan refleksi Java?Pergi terus ke kod

Atas ialah kandungan terperinci Bagaimana untuk mendapatkan nilai harta medan objek menggunakan refleksi Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam