как правильно использовать отражение (особый случай) JAVA - PullRequest
1 голос
/ 04 мая 2020

У меня есть класс POJO, в котором много добытчиков. Теперь я использую класс Method из пакета java .lang.reflect, чтобы получить все методы get из этого класса. Я хочу вызвать этих добытчиков, но понятия не имею, как. arraylistFilter - это Arraylist<pojo>, который содержит результат моего запроса. Option - это тип данных Object Field, который на самом деле имеет около 100 получателей. Как я могу получить каждый из них без необходимости звонить 1 на 1. Что происходит у меня. ??? вот где я хочу иметь возможность вызывать моих добытчиков.

try {
    Class<? extends Options> testObject = new Options().getClass();
    Method[] methods = testObject.getMethods();
    for (Method method : methods) {
        String name = method.getName();
        if (method.getName().startsWith("get") &&
            method.getGenericParameterTypes().length == 0) {
            for (int i = 0; i < arrayListFilter.size(); i++) {
                arrayListFilter.get(i).getOptions().???;
            }
        }
    }
} catch (Exception e) {
    // do something with the exceptions
}

1 Ответ

1 голос
/ 04 мая 2020

Это будет примерно так:

try {
    Method[] methods = Options.class.getMethods();
    for (Method method : methods) {
        String name = method.getName();
        if (method.getName().startsWith("get") &&
            method.getParameterTypes().length == 0) {
            for (int i = 0; i < arrayListFilter.size(); i++) {
                Object value = method.invoke(arrayListFilter.get(i).getOptions());
                // The actual type of 'value' will depend on the getter's
                // formal return type AND the actual type it returns.
                // When the return type is a primitive, it is mapped to
                // the corresponding wrapper.  
            }
        }
    }
} catch (Exception e) {
    // do something with the exceptions
}

Мы упростили / исправили код, который получает объекты Method, и изменили getGenericParameterTypes() на getParameterTypes(). Параметры типа Generi c здесь не релевантны, но вам do необходимо отфильтровать геттеры, требующие аргументов, потому что нет способа предоставить разумные значения аргументов.

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