Отражение Java: получение полей и методов в порядке объявления - PullRequest
28 голосов
/ 15 февраля 2011

Есть ли способ получить классы, объявленные поля (и методы) в порядке объявления с использованием отражения? Согласно документации, порядок методов и полей, возвращаемых getFields(), getDeclaredFields() и т. Д., Не определен.

Задать что-то вроде индекса можно было бы с помощью аннотации, предложенной в Отражение Java: стандартизирован ли порядок полей и методов класса?

Есть ли лучшие варианты, то есть нет необходимости указывать индекс вручную?

Теперь, прежде чем спросить, для чего мне это нужно: у нас есть метод, который принимает в качестве входных данных довольно большую структуру данных и выполняет для нее длительные вычисления. Для создания модульных тестов мы создали метод, который принимает входной объект и выходной экземпляр и создает исходный код Java (настройку ввода, вызов метода вычисления и утверждение правильных результатов впоследствии) в качестве вывода. Этот код гораздо удобнее для чтения, когда поля написаны в порядке объявления.

Ответы [ 6 ]

11 голосов
/ 15 февраля 2011

В jdk 6 отраженные поля находятся в порядке их объявления.В начале JDK это было не так.По-видимому, достаточное количество людей придираются.

Хотя это не гарантируется Javadoc, я все равно приму этот заказ как должное, и я предполагаю, что он будет сохранен и в будущих jdks.как и в большинстве приложений, зависимость от порядка объявления в основном тщеславна - ваше приложение не потерпит неудачу, если порядок испортится, оно просто станет немного уродливее.

5 голосов
/ 15 февраля 2011

Нет, невозможно с отражением. Однако вы можете решить ее, используя ProcessBuilder и команду javap:

Учитывая Test.java:

public abstract class Test {

    public void method1() {
    }

    public void method2() {
    }

    public static void main(String[] args) {
    }

    public String method3() {
        return "hello";
    }

    abstract void method4();

    final int method5() {
        return 0;
    }
}

Команда javap Test печатает:

...
public Test();
public void method1();
public void method2();
public static void main(java.lang.String[]);
public java.lang.String method3();
abstract void method4();
final int method5();
...
4 голосов
/ 13 августа 2016

Это была отдельная проблема, посмотрите на

https://github.com/wmacevoy/kiss/blob/master/src/main/java/kiss/util/Reflect.java

и метод

public static Method [] getDeclaredMethodsInOrder (Class clazz)

Он получает порядок, посмотрев на байт-код класса.Если вы просто хотите использовать libray, это будет kiss.util.Reflect.getDeclaredMethodsInOrder(Test.class)

2 голосов
/ 15 февраля 2011

Боюсь, что это невозможно без изменения процесса компиляции. Обычно поле записывается в файл класса в любом порядке, а информация о порядке объявления теряется.

Скорее всего, вы можете использовать процессор аннотаций для записи заказа во вспомогательный файл.

Это должно быть довольно легко. Смотри например на interfacegen для примера, как может работать процессор аннотаций. Возможно, вы захотите поместить информацию в один и тот же файл, но это намного сложнее.

1 голос
/ 15 февраля 2011

Вы можете подумать об использовании Javadoc с пользовательским Доклетом, но для этого необходим доступ к источнику.

До сих пор нет никаких гарантий относительно порядка в API ( методы , поля , но каждый вывод Javadoc, который я когда-либо видел, имеет их в правильном порядке, поэтому я полагаю, доклеты получают их в порядке декларирования.

0 голосов
/ 15 февраля 2011

Вы не сможете получить информацию из файла класса.Как сказал Адам в ответе на другой вопрос:

Элементы в возвращаемом массиве не отсортированы и не в каком-либо определенном порядке.

И "нетorder "включает" no order order ".

Однажды я использовал анализатор исходного файла Java для получения входных данных для генераторов кода.И таким образом у вас будут поля и методы в порядке объявления.

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