如何通过Class对象访问静态成员

时间:2012-08-12 21:01:56

标签: java

我想在我的一个类上访问一个静态HashMap对象。这个伪代码说明了我是如何尝试的。

public Class A
{
 public static HashMap<String,String> myMap;
 static
 {
  myMap.put("my key", "my value");
 }
}
...
public void myfunction(Class clazz)
{
 HashMap<String,String> myMap = clazz.getThatStaticMap();
}
...
myFunction(A.getClass());

getThatStaticMap()的调用是我不知道该怎么做的部分。

在我的实际代码中,我使用类作为参数调用myfunction并返回使用类的newInstance()方法创建的ArrayList个对象但我想要访问属于该静态数据的对象到类来配置每个实例。

3 个答案:

答案 0 :(得分:5)

如果我理解正确,您希望使用reflection来访问该字段。您可以使用Class#getFieldClass#getDeclaredField访问地图,如下所示:

Field hashmapField = clazz.getField("myMap");
//Note, since this is static, we pass it null.
Object fieldValue = hashmapField.get(null);
HashMap<String,String> myMap = (HashMap<String,String>)fieldValue;

但是,如果您有几个类将具有“myMap”字段,您可以考虑重构代码以使interface像这样:

public interface StringMappable{
  HashMap<String,String> getMap();
}

而不是使用反射。

答案 1 :(得分:3)

来自:herehere

clazz.getField("myMap").get(null)

答案 2 :(得分:2)

你想要这样的东西:

public void myfunction(Class clazz)
{
    HashMap<String,String> myMap = clazz.getField("myMap").get(null);
}

Field.get(Object) method docs say

  

如果底层字段是静态字段,则忽略obj参数;它可能是null。

Class.getField(String) method docs say

  

返回一个Field对象,该对象反映此Class对象所表示的类或接口的指定公共成员字段。 name参数是一个String,指定所需字段的简单名称。