Java 获取不可实例化类的字段值-反射
如何迭代并获取不可实例化类的所有字段的值:Java 获取不可实例化类的字段值-反射,java,reflection,Java,Reflection,如何迭代并获取不可实例化类的所有字段的值: import java.lang.reflect.Field; public class NonInstantiableClass { private Integer a1 = 1; private String a2 = "a"; private NonInstantiableClass () { throw new AssertionError(); } public static v
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";
试试这个:
import java.lang.reflect.Field;
public class NonInstantiableClass {
private static Integer a1 = 1;
private static 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();
}
}
但这只会告诉您静态字段。如果字段不是静态的,getVariableValue将返回null。谢谢您的回答,这很有趣,但它不会填充字段。使用例如
System.out.println(field.get(cl))打印其值代码>获取空值。试着按照这个解决方案,我没有找到如何填充它们。哦!我不知道你在寻找他们的价值观,我的错。我也会尝试处理这个问题。我已经修复了它,它现在会给你值。如果这个类没有实例化,如何设置值?除new关键字外,还有其他实例化对象的方法,有些方法可以绕过构造函数。但最终你必须有一个对现有对象的引用,你是对的,Dylan,我的意思是静态构建它们。真丢脸,谢谢。我已经更新了我的答案,让它成为你现在想要的。