Java — как извлечь значения полей из другого класса

#java

Вопрос:

Я пытаюсь получить все поля и значения из другого класса, доступного только для чтения, и записать их в файл, как получить значения полей?

Класс доступен только для чтения и не имеет геттеров:

 public class colorConstants {  public static final String BLUE = "blue";  public static final String RED = "red";  public static final String YELLOW = "yellow";  ...    public colorConstants() {}  }  

В другом классе:

 Field[] fields = colorConstants.class.getFields(); for(Field : fields) {  String fieldName = fieldName;    //how to get the value of each field  String value = fieldName.get()? }  

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

1. вы можете получить значение статических полей только из класса. Вы можете перейти null в get для статических членов

2. Вы не можете изменить класс констант? Потому что это звучит так, как будто ты действительно хочешь, чтобы это было enum .

3. @JohnBayko нет, я не могу его изменить, он импортирован из чужой упаковки

Ответ №1:

Ты можешь сделать это вот так:

 import java.lang.reflect.Field;  import static java.lang.reflect.Modifier.STATIC;  public class Example {  public static class colorConstants {  public static final String BLUE = "blue";  public static final String RED = "red";  public static final String YELLOW = "yellow";  public String blah;   public colorConstants() {}  }   public static void main(String[] args) throws IllegalAccessException {  Field[] fields = colorConstants.class.getFields();  for (Field field : fields) {   if ((field.getModifiers() amp; STATIC) != 0) {  String value = (String) field.get(null);  System.out.println(value);  } else {  System.out.println("Ignoring non-static field "   field.getName());  }  }  } }   

Я улучшил стиль , изменив colorConstants его на ColorConstants , так как имена классов должны начинаться с прописных букв, и изменив Field на field .

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

1. это может привести к исключениям, если существуют нестатические члены. Лучше проверить field.Modifiers amp; Modifier.STATIC != 0 , прежде чем пытаться

2. Спасибо за ваш ответ. изменил вопрос о том, что класс colorConstants доступен только для чтения и не имеет геттеров, поэтому в поле.get() будет исключение незаконного доступа.

3. Я не совсем понимаю, что ты имеешь в виду? Класс и поля таковы public . Пожалуйста, добавьте трассировку стека исключения в свой вопрос.