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

Java 如何通过类对象访问静态成员,java,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.getT

我想访问我的一个类上的静态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());
公共A类
{
公共静态HashMap-myMap;
静止的
{
myMap.put(“我的钥匙”、“我的价值”);
}
}
...
公共函数(类clazz)
{
HashMap myMap=clazz.gethatstaticmap();
}
...
myFunction(A.getClass());
调用
getHatStaticMap()
是我不知道该怎么做的部分


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

您希望这样:

public void myfunction(Class clazz)
{
    HashMap<String,String> myMap = clazz.getField("myMap").get(null);
}
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;
public interface StringMappable{
  HashMap<String,String> getMap();
}
公共函数(类clazz)
{
HashMap myMap=clazz.getField(“myMap”).get(null);
}
委员会:

如果基础字段是静态字段,则忽略obj参数;它可能是空的

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


你想要这样的东西:

public void myfunction(Class clazz)
{
    HashMap<String,String> myMap = clazz.getField("myMap").get(null);
}
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;
public interface StringMappable{
  HashMap<String,String> getMap();
}
公共函数(类clazz)
{
HashMap myMap=clazz.getField(“myMap”).get(null);
}
委员会:

如果基础字段是静态字段,则忽略obj参数;它可能是空的

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

发件人:和:

发件人:和:


如果我理解正确,您希望使用访问字段。您可以使用或访问地图,如下所示:

public void myfunction(Class clazz)
{
    HashMap<String,String> myMap = clazz.getField("myMap").get(null);
}
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;
public interface StringMappable{
  HashMap<String,String> getMap();
}
fieldhashmapfield=clazz.getField(“myMap”);
//注意,因为这是静态的,所以我们将其传递为null。
objectfieldvalue=hashmapField.get(null);
HashMap myMap=(HashMap)字段值;

但是,如果你有几个类要有一个“MYMAP”字段,你可以考虑重构你的代码有这样的一个:

public void myfunction(Class clazz)
{
    HashMap<String,String> myMap = clazz.getField("myMap").get(null);
}
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;
public interface StringMappable{
  HashMap<String,String> getMap();
}
公共接口字符串可映射{
HashMap getMap();
}

而不是使用反射。

如果我理解正确,您希望使用来访问字段。您可以使用或访问地图,如下所示:

public void myfunction(Class clazz)
{
    HashMap<String,String> myMap = clazz.getField("myMap").get(null);
}
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;
public interface StringMappable{
  HashMap<String,String> getMap();
}
fieldhashmapfield=clazz.getField(“myMap”);
//注意,因为这是静态的,所以我们将其传递为null。
objectfieldvalue=hashmapField.get(null);
HashMap myMap=(HashMap)字段值;

但是,如果你有几个类要有一个“MYMAP”字段,你可以考虑重构你的代码有这样的一个:

public void myfunction(Class clazz)
{
    HashMap<String,String> myMap = clazz.getField("myMap").get(null);
}
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;
public interface StringMappable{
  HashMap<String,String> getMap();
}
公共接口字符串可映射{
HashMap getMap();
}


而不是使用反射。

A对我来说不可用,只有类对象clazz。我还应该提到(使事情复杂化)我使用一个超类来存储实例化的对象(ArrayList),因此B超类似乎不知道哪个静态成员是a(或任何其他子类)对我来说,听起来你需要重新考虑你的类的层次结构,可能会放一些新的超级接口或抽象类MyMap是一个静态类,所以类a的所有实例都会有相同的静态映射,为什么类a对你不可用?你只需要一个导入类A;因为类A是类B的一个子类,我使用一个类B容器来存储类A的一个实例。当我引用类B容器时,它有自己的静态HashMap,它不是正确的。A对我不可用,只是类对象clazz。我还应该提到(使事情复杂化)我使用一个超类来存储实例化的对象(ArrayList),因此B超类似乎不知道哪个静态成员是a(或任何其他子类)对我来说,听起来你需要重新考虑你的类的层次结构,可能会放一些新的超级接口或抽象类MyMap是一个静态类,所以类a的所有实例都会有相同的静态映射,为什么类a对你不可用?你只需要一个导入类A;因为类A是类B的子类,我使用类B容器来存储类A的实例。当我引用类B容器时,它有自己的静态HashMap,它不是正确的。你也可以传递它
clazz
,我更喜欢,由于该字段属于
对象,我仍然不明白他为什么只在他的代码中执行A.myMap。如果我理解正确的话,
myfunction
被赋予一个类对象,该类对象有一个名为
myMap
的字段
myfunction
不知道clazz是一个;它可能是另一个名为B的类,它有一个静态映射,因此他试图以一种独立于clazz实际是什么的方式访问
myMap
getField
然后是hashmapField.get(null)用于获取我需要的特定静态成员。@Zach在这种情况下,为什么不使用接口?您也可以传递它
clazz
,这是我更喜欢的,因为该字段属于
对象,我仍然不明白他为什么只在代码中使用.myMapWell,如果我理解正确,
myfunction
被赋予一个类对象,该类对象有一个名为
myMap
的字段
myfunction
不知道clazz是一个;它可能是另一个名为B的类,它有一个静态映射,因此他试图以一种独立于clazz实际是什么的方式访问
myMap
getField
然后是hashmapField.get(null)工作以获取我需要的特定静态成员。@Zach在这种情况下,为什么不使用接口?