Отражение Java - соответствие формального списка параметров фактическому списку параметров - PullRequest
3 голосов
/ 08 декабря 2011

Допустим, у меня есть класс Foo, подобный этому

public class Foo {
    public void setParameter(String name, Object value) {
       // ...
    }
}

Я хотел бы получить метод setParameter с помощью отражения.

Проблема в том, что в моем кодеЯ знаю только параметры ACTUAL , когда мне нужно получить этот метод.Я построил небольшой метод, который может дать мне массив Class фактических параметров.К сожалению, возвращенный массив Class из фактических параметров ([String.class, String.class]) не соответствует массив Class из формальных параметров ([String.class, Object.class]) и getDeclaredMethodВозникает исключение NoSuchMethodException.

Вам известна какая-либо библиотека или фрагмент кода, который может помочь в сопоставлении с методом?

Ответы [ 2 ]

4 голосов
/ 08 декабря 2011

Вам, вероятно, нужно быть немного умнее в поиске того, какой метод вызывать.Один из вариантов - выполнить итерацию по каждому методу из getDeclaredMethods(), сначала проверив имя метода, чтобы убедиться, что это тот метод, который вы хотите вызвать, а затем проверив, совпадает ли число фактических параметров с числом формальныхпараметров, и, наконец, если оба они истинны, перебирая фактические параметры и проверяя, можно ли назначить класс параметров из класса формальных параметров.

Однако одна проблема заключается в том, что происходит, если у вас есть методы:

public void setParameter(String name, Object value);
public void setParameter(String name, String value);

, поскольку оба будут соответствовать этому тесту.

Я не знаю ни одной библиотеки верхней части моей головы, которая могла бы справиться с этим легким способом.Хотя большинство фреймворков для внедрения зависимостей (Spring, Guice) имело бы некоторую поддержку для своих нужд, и, возможно, стоит посмотреть, как они работают.

ответ Джона Скита здесь имеетпример того, что я объясняю.

2 голосов
/ 08 декабря 2011

Я бы просто использовал getDeclaredMethods(), чтобы получить все методы, а затем выполнить сопоставление в вашем коде на основе имени метода, количества параметров и, наконец, Class.isAssignableFrom(), чтобы проверить, соответствуют ли типы параметров сигнатуре. Это оставляет случаи, когда подписи перегруженных методов различаются по типам, которые могут быть совместимы с одним и тем же конкретным типом (интерфейсами или супер / подклассами). Вы должны решить, должен ли ваш код поддерживать такие угловые случаи.

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