#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
. Пожалуйста, добавьте трассировку стека исключения в свой вопрос.