我有以下课程结构:
private static class MyStaticClass {
public final String name;
public final String photoUri;
private MyStaticClass(String pName, String pPhotoUri) {
this.name = pName;
this.photoUri = pPhotoUri;
}
public static MyStaticClass getNewMyStaticClass(String pName) {
return new MyStaticClass(pName, null);
}
}
现在,当我想读取“name”和“photoUri”字段的值时,它给了我“对象不是类的实例”。以下是代码:
void printValues() {
try {
Class cls = Class.forName("my.pkg.name.TestClass$MyStaticClass");
for(Field field: cls.getDeclaredFields()) {
System.out.println("Field name: " + field.getName());
System.out.println("Field value: " + field.get(cls));
}
} catch (Throwable e) {
e.printStackTrace();
}
}
我还尝试在field.get(null)传递“null”来读取值,但它给出了空指针异常。
请帮助我,如何阅读“name”和“photoUri”字段的值?
答案 0 :(得分:2)
您的字段不是静态的,您应该在调用field.get()时指定实例。
像这样调用它确实有效:
field.get(new MyStaticClass("name", "photoUri"))
答案 1 :(得分:0)
静态嵌套类是一个实际的类,除了它不是顶级的。由于您正在尝试查看此类的成员变量,因此您实际上需要该类的实例化对象来执行此操作。
答案 2 :(得分:0)
表达式field.get(cls)
实际上会尝试从field
中提取cls
的值,但field
属于MyStaticClass
,而不是Class
(因为您正在遍历MyStaticClass
中声明的所有字段。该表达式将抛出IllegalArgumentException
。
使用field.get(o)
,其中o
是MyStaticClass
的实例或其子类。