2015-10-19 35 views
1

如果对该类的唯一可用访问是.class,是否可以访问类中的公共变量?
举个例子,如果我有两个ClassAClassBA_VARIABLE,如果我把参考每班Object到HashSet的,我能够检索A_VARIABLE在HashSet的每个项目。通过`.class`的使用检索类变量

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 
+0

'ClassA.A_VARIABLE'(这是一个恒定的场)和类应该做的伎俩 – 2015-10-19 05:48:36

+0

@RC的'equals'不会这意味着他需要施放他的Class对象...? – schneida

+0

@schneida nope,见拉胡尔答案 – 2015-10-19 07:28:16

回答

3

是的,你可以做到这一点,你需要的反射比直接访问速度较慢,但​​仍然被广泛使用:

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是因为您的字段是静态的。如果他们不是,你将不得不提供你想获得价值的实例。

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

1

你能做到下面的方式

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); 
      } 
}