1

我想访问我的一个类上的静态 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使用类作为参数调用并返回 ArrayList使用类的 newInstance() 方法创建的对象,但我希望访问属于该类的静态数据来配置每个实例。

4

3 回答 3

5

如果我对您的理解正确,您想使用反射来访问该字段。您可以使用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”字段,则可以考虑重构代码以具有如下接口

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

而不是使用反射。

于 2012-08-13T00:17:53.490 回答
3

来自:这里这里

clazz.getField("myMap").get(null)
于 2012-08-13T00:15:22.540 回答
2

你想要这样的东西:

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

Field.get(Object)方法文档说:

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

Class.getField(String)方法文档说:

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

于 2012-08-13T00:14:51.043 回答