如何迭代并获取非可实例化类的所有字段的值:
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();
}
}
有更好的方法解决这个问题吗?
谢谢。
编辑:
正如Dylan指出的,如果类不可实例化,则无法初始化实例字段。当然,这些字段是静态的:
private static Integer a1 = 1;
private static String a2 = "a";