#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];
...