Java 反射:获取对象字段值与类型


#Java 反射、泛型与注解#


示例1

import lombok.Data;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Field;

public class TestJava {

    @Data
    public static class UserInfo {
        private String name;
    }


    @Test
    public void test_01() throws NoSuchFieldException, IllegalAccessException {
        UserInfo userInfo = new UserInfo();
        userInfo.setName("李白");
        Field field = UserInfo.class.getDeclaredField("name");

        System.out.println(field.getType());  // 返回类型 Class<?>
        // 以上代码输出: class java.lang.String
        System.out.println(field.getGenericType());  // 返回 Type
        // 以上代码输出: class java.lang.String
        System.out.println(field.getName());  // 返回类型 String
        // 以上代码输出: name
        System.out.println((String)field.get(userInfo));  // 获取 userInfo 中 name 字段的值
        // 以上代码输出: 李白
    }

}

示例2

package org.example;

import lombok.Data;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;

public class TestJava {

    @Data
    public static class DataHolder<T> {
        private T data;
    }

    @Test
    public void test_01() throws NoSuchFieldException, IllegalAccessException {
        DataHolder<String> dataHolder = new DataHolder<>();
        dataHolder.setData("李白");

        Field field = DataHolder.class.getDeclaredField("data");

        System.out.println(field.getType());  // 返回类型 Class<?>
        // 以上代码输出: class java.lang.Object
        System.out.println(field.getGenericType());  // 返回类型 Type
        // 以上代码输出: T
        System.out.println(field.getGenericType() instanceof ParameterizedType);
        // 以上代码输出: false
        System.out.println(field.getName());  // 返回类型 String
        // 以上代码输出: data
        System.out.println((String)field.get(dataHolder));  // 获取 dataHolder 中 data 字段的值
        // 以上代码输出: 李白
    }

}

示例3


import lombok.Data;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TestJava {

    @Data
    public static class DataListHolder<T> {
        private List<T> dataList;
    }

    @Test
    public void test_01() throws NoSuchFieldException, IllegalAccessException {
        DataListHolder<String> dataListHolder = new DataListHolder<>();
        dataListHolder.setDataList(new ArrayList<>());
        dataListHolder.getDataList().add("李白");

        Field field = DataListHolder.class.getDeclaredField("dataList");

        System.out.println(field.getType());  // 返回类型 Class<?>
        // 以上代码输出: interface java.util.List
        System.out.println(field.getGenericType());  // 返回类型 Type
        // 以上代码输出: java.util.List<T>
        System.out.println(field.getGenericType() instanceof ParameterizedType);
        // 以上代码输出: true
        if (field.getGenericType() instanceof ParameterizedType) {
            ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType();
            System.out.println(parameterizedType.getRawType());
            // 以上代码输出: interface java.util.List
            System.out.println(parameterizedType.getOwnerType());
            // 以上代码输出: null
            System.out.println(Arrays.toString(parameterizedType.getActualTypeArguments()));
            // 以上代码输出:[T]
        }
        System.out.println(field.getName());  // 返回类型 String
        // 以上代码输出: dataList
        System.out.println(field.get(dataListHolder));  // 获取 dataListHolder 中 dataList 字段的值
        // 以上代码输出: [李白]
    }

}

示例4

package org.example;

import lombok.Data;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TestJava {

    @Data
    public static class DataListHolder {
        private List<String> dataList;
    }

    @Test
    public void test_01() throws NoSuchFieldException, IllegalAccessException {
        DataListHolder dataListHolder = new DataListHolder();
        dataListHolder.setDataList(new ArrayList<>());
        dataListHolder.getDataList().add("李白");

        Field field = DataListHolder.class.getDeclaredField("dataList");

        System.out.println(field.getType());  // 返回类型 Class<?>
        // 以上代码输出: interface java.util.List
        System.out.println(field.getGenericType());  // 返回类型 Type
        // 以上代码输出: java.util.List<java.lang.String>
        System.out.println(field.getGenericType() instanceof ParameterizedType);
        // 以上代码输出: true
        if (field.getGenericType() instanceof ParameterizedType) {
            ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType();
            System.out.println(parameterizedType.getRawType());
            // 以上代码输出: interface java.util.List
            System.out.println(parameterizedType.getOwnerType());
            // 以上代码输出: null
            System.out.println(Arrays.toString(parameterizedType.getActualTypeArguments()));
            // 以上代码输出:[class java.lang.String]
        }
        System.out.println(field.getName());  // 返回类型 String
        // 以上代码输出: dataList
        System.out.println(field.get(dataListHolder));  // 获取 dataListHolder 中 dataList 字段的值
        // 以上代码输出: [李白]
    }

}

( 本文完 )