Метод определения отражения Java - PullRequest
0 голосов
/ 26 октября 2019

У меня проблема с поиском метода с помощью Java, например, я должен напечатать значение в System.out с помощью отражения:

public static void print(Object value) {
    Method method = PrintStream.class.getMethod("print", value.getClass());
    method.invoke(System.out, value);
}

Он отлично работает со строками, но когда я передаюНапример, MyClass, например, я получаю следующую ошибку:

java.lang.NoSuchMethodException: java.io.PrintStream.print(MyClass)
    at java.lang.Class.getMethod(Class.java:1786)
    at Test.print(Test.java:20)
    at Test.main(Test.java:15)

Я полагаю, это потому, что Java не может найти метод с точной сигнатурой, но здесь java.io.PrintStream.print(java.lang.Object) хорошо подходит. Как я могу найти метод, который подходит для следующих классов, а не просто имеет одну и ту же сигнатуру? Подход также должен работать для нескольких аргументов.

1 Ответ

3 голосов
/ 26 октября 2019

Я полагаю, это потому, что Java не может найти метод с точной подписью ...

Это правильно. API отражения не поддерживают это. Нет простого способа реплицировать разрешение перегрузки Java (статического) метода при рефлексивном поиске метода.

Непростой способ:

  1. Идентифицировать все классы иинтерфейсы, которые MyClass реализует. (Вы можете сделать это рефлексивно.)
  2. Вызовите PrintStream.class.getMethod("print", type) для каждого из этих классов / типов интерфейсов.
  3. Если вы получили более одного результата из шага 2, используйте некоторую эвристику для отработкикакой метод является «лучшим» для использования. (Это не обязательно тот, который отражает то, что делает JLS, хотя это, вероятно, будет «наименее удивительным» подходом к использованию.)

Существуют сторонние библиотеки, которые будут делать это длявы;посмотрите на эти вопросы и ответы на некоторые предложения:

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