Как я могу получить исходный атрибут объекта Field в Java? - PullRequest
0 голосов
/ 28 октября 2019

Я перебираю Поля класса и мне нужно вернуть исходный класс его Поля.

Класс, который я перебираю, полон объектов "Ресурс", которые я перебираю. И мне нужно вернуть объект «Ресурс» вместо объекта «Поле». Как я могу это сделать?

 private Resource getPredicate(String header) {
    for(Field field : VCARD4.class.getDeclaredFields()){
        String name = field.getName();
        if(header.equalsIgnoreCase(name)){

        }
    }

1 Ответ

0 голосов
/ 28 октября 2019

Я думаю, что вам нужно что-то вроде этого:

import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.util.ReflectionUtils;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicReference;

class VCARD4 {
    Resource resource_a = new FileSystemResource("/dev/null");
    Resource resource_b = new FileSystemResource("/dev/null");
    Class<?> class_a = Object.class;

    public Resource getResource_a() {
        return resource_a;
    }

    public Resource getResource_b() {
        return resource_b;
    }

    public Class<?> getClass_a() {
        return class_a;
    }
}

class Scratch {
    public static void main(String[] args) {
        VCARD4 vcard4 = new VCARD4();

        Object fieldValue = getPredicate(vcard4, "resource_a");

        System.out.println("Field value: " + fieldValue);
        System.out.println("Field class name: " + fieldValue.getClass().getName());
        System.out.println("Field superclass name: " + fieldValue.getClass().getGenericSuperclass().getTypeName());
    }

    private static Object getPredicate(VCARD4 object, String fieldName) {
        AtomicReference<Object> targetField = new AtomicReference<>();

        Arrays.stream(PropertyUtils.getPropertyDescriptors(VCARD4.class))
                .filter(property -> property.getReadMethod().getName().equalsIgnoreCase("get" + fieldName))
                .findFirst()
                .ifPresent(foundField -> {
                    Method method = foundField.getReadMethod();
                    method.setAccessible(true);
                    targetField.set(ReflectionUtils.invokeMethod(method, object));
                });

        return targetField.get();
    }
}

Это даст вам в основном значение поля, указанного в классе VCARD4. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...