Как я могу отражать тело метода рефлексивно? - PullRequest
4 голосов
/ 01 июня 2010

Прямо сейчас у меня есть

private static void getMethods(Class<? extends Object> clazz) {
    Method[] declaredMethods = clazz.getDeclaredMethods();
    for (Method aMethod : declaredMethods) {
      aMethod.setAccessible(true);

      // Print the declaration
      System.out.print(Modifier.toString(aMethod.getModifiers()) + " "
          + aMethod.getReturnType().getSimpleName() + " " + aMethod.getName());

      // Get Parameter Types
      getParameters(aMethod);

      //Empty Body
      System.out.println("{}\n");
    }
  }

Который печатает большую часть информации отражательно, но создает пустое тело. Как добавить к отражающей природе Java печать тела метода?

Ответы [ 4 ]

6 голосов
/ 01 июня 2010

Как добавить к отражающей природе Java для печати тела метода?

Боюсь, со значительным трудом.

Для начала, исходный код, скорее всего, будет недоступен для работающей программы. Как правило, разработчики не включают исходный код в двоичные JAR-файлы. (И даже если они это сделают, нет гарантии, что они будут «настоящими» источниками.)

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

Предполагая, что вы можете получить настоящие байт-коды, последним шагом будет либо отобразить их в необработанном виде, либо разобрать или декомпилировать их во что-то более читаемое. Вы должны иметь возможность использовать javap для разборки, но декомпиляция повлечет за собой использование стороннего продукта. Конечно, декомпилированный код будет значительно отличаться от исходного кода, и, если байт-коды были запутаны, их исходный код будет в значительной степени нечитаемым.

4 голосов
/ 01 июня 2010

Java не имеет этой информации во время выполнения. Единственное, что вы можете напечатать, это байт-код.

1 голос
/ 01 июня 2010

Единственный способ сделать что-то подобное - написать / использовать декомпилятор. Это предполагает непосредственное чтение байт-кода, что не является стандартной функцией ReflectionAPI. Исходный код, представленный в исходном исходном файле, пропал, и может оказаться невозможным полностью воспроизвести его, как это было из байтового кода. (Например, универсальные элементы будут потеряны, так как использование расширенного цикла for не будет различимо, и я уверен, что есть и другие).

0 голосов
/ 03 января 2017

Если код, который вы хотите напечатать, принадлежит вам, вы можете отправить исходные коды и использовать код метода из этого ответа для извлечения желаемых методов:

getTheCode () метод

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