通过使用' .class '检索类变量

  • 本文关键字:class 类变量 检索 java
  • 更新时间 :
  • 英文 :


是否有可能访问类中的公共变量,而对该类的唯一可用访问是它的.class
作为一个例子,如果我在ClassAClassB中都有A_VARIABLE,如果我将引用放到每个类Object的HashSet中,我是否能够检索HashSet中每个项目的A_VARIABLE ?

public class ClassA{
    public static final String A_VARIABLE = "ABC";
}
public class ClassB{
    public static final String A_VARIABLE = "123";
}

public class ClassC{
    private void someMethod(){
        HashSet<Class> someClassHashSet = new HashSet<>();
        someClassHashSet.add(ClassA.class);
        someClassHashSet.add(ClassB.class);
        for (Class someClass : someClassHashSet){
            System.out.println("The value is: " + /*someClass.A_VARIABLE*/);
        }
    }
}

我想打印的内容:

The Value is: ABC
The Value is: 123

是的,你可以这样做,你需要反射,这比直接访问慢,但仍然广泛使用:

for (Class someClass : someClassHashSet){
        Object value = null;
        try {
            value = someClass.getField("A_VARIABLE").get(null);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        System.out.println("The value is: " + value);
}

您可以看到,这段代码获取了一个字段的值,您只能通过字符串引用该字段。.get(null)中的null是因为您的字段是静态的。如果它们不存在,则必须提供一个希望从中获取值的实例。

注意:您的someemethod()缺少返回值,例如void。

您可以按以下方式操作

 for (Class someClass : someClassHashSet){
         if (ClassA.class.equals(someClass)) {
            System.out.println("The value is: " + ClassA.A_VARIABLE );  
          } else if (ClassB.class.equals(someClass)) {
            System.out.println("The value is: " + ClassB.A_VARIABLE );
          }
 }

最新更新