Как выполнить итерацию и получить значение всех полей неинстанцируемого класса:
import java.lang.reflect.Field;
public class NonInstantiableClass {
private Integer a1 = 1;
private String a2 = "a";
private NonInstantiableClass () {
throw new AssertionError();
}
public static void printVariables () throws IllegalAccessException {
for (Field field : NonInstantiableClass.class.getDeclaredFields()) {
field.setAccessible(true);
System.out.println(field.getName()
+ " - " + field.getType()
+ " - " + field.get(NonInstantiableClass.class));
}
}
public static void main(String args[]) throws IllegalAccessException {
NonInstantiableClass.printVariables();
}
}
Учитывая, что этот код получает следующую ошибку:
Exception in thread "main" java.lang.IllegalArgumentException: Can not set java.lang.Integer field NonInstanciableClass.a1 to java.lang.Class
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
at java.base/jdk.internal.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
at java.base/java.lang.reflect.Field.get(Field.java:418)
at NonInstanciableClass.printVariables(NonInstanciableClass.java:17)
at NonInstanciableClass.main(NonInstanciableClass.java:23)
Если класс был инстанцируемымтот же код работает с экземпляром:
import java.lang.reflect.Field;
public class NonInstantiableClass {
private Integer a1 = 1;
private String a2 = "a";
//private NonInstantiableClass () {
// throw new AssertionError();
//}
public static void printVariables () throws IllegalAccessException {
for (Field field : NonInstantiableClass.class.getDeclaredFields()) {
field.setAccessible(true);
System.out.println(field.getName()
+ " - " + field.getType()
+ " - " + field.get(new NonInstantiableClass()));
}
}
public static void main(String args[]) throws IllegalAccessException {
NonInstantiableClass.printVariables();
}
}
Есть ли лучший подход для решения этой проблемы?
Спасибо.
РЕДАКТИРОВАТЬ:
КакДилан указал, что если класс не является экземпляром, поля экземпляра не могут быть инициализированы.Конечно поля являются статическими:
private static Integer a1 = 1;
private static String a2 = "a";