Доступ к комментарию java в массиве с использованием отражения

#java

#java

Вопрос:

Представьте, что есть переменная массива, подобная следующей:

 private static final String[] STRINGS = {
        // Put log lines to test here
        "a",
        // Jira ticket 1
        "b",
        // Jira ticket 2
        "c" 
};
  

По сути, я создаю код, который будет переходить к этому классу и копировать массив СТРОК. Можно ли использовать отражение для получения этого массива СТРОК с вложенными комментариями? Я не думаю, что это возможно, но я хотел спросить, есть ли другие направления, которые я мог бы предпринять. Комментарии полезны для отслеживания изменений, и я пытаюсь использовать это как способ сохранить эту информацию.

Комментарии:

1. Комментарии не сохраняются в скомпилированном коде.

Ответ №1:

Некоторые вещи просто исчезают после компиляции. Некоторые обобщения и все комментарии просто отсутствуют в этом файле класса, а исходный файл отсутствует во время выполнения, поэтому ответ прост: невозможно.

Есть несколько альтернатив. Например, вы можете отправить исходный файл (упаковать в jar при его развертывании), а затем проанализировать исходные тексты, но синтаксический анализ кода Java явно нетривиален, поэтому я действительно не рекомендую этот маршрут.

Вы также можете поместить эти комментарии в простые текстовые файлы и упаковать их, это гораздо лучший план; вы можете использовать MyClassName.class.getResourceAsStream("jira-ticket-assignments.txt") для получения inputstream с этими данными, и это работает до тех пор, пока файл с именем jira-ticket-assignments.txt находится в том же месте MyClassName.class , что и (даже в файле jar, не проблема).

Это так, или вместо этого превратите эти комментарии в строковые литералы:

 private static final Map<String, String> STRINGS = Map.of(
    "a", "Jira ticket 1",
    "b", "Jira ticket 2",
    "c", "");
  

Ответ №2:

Как сказал @rzwitserloot выше, некоторые вещи просто исчезают после компиляции. Если вам нужно сохранить некоторую метаинформацию во время выполнения, вы можете использовать аннотации

 @Comment({
    "Put log lines to test here",
    "Jira ticket 1",
    "Jira ticket 2"})
private static final String[] STRINGS = {
    "a",
    "b",
    "c"
};
  

Для этого необходимо создать аннотацию:

 @Retention(RetentionPolicy.RUNTIME)
public @interface Comment {
    String[] value();
}
  

И использование во время выполнения:

 String[] comments = SomeClass.class.getDeclaredField("STRINGS").getAnnotation(Comment.class).value();
String firstElementComment = comments[0];
String secondElementComment = comments[1];
...