使用反射获取静态类的最终字段的值

时间:2011-06-21 18:46:52

标签: java

我有以下课程结构:

       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”字段的值?

3 个答案:

答案 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),其中oMyStaticClass的实例或其子类。