在Reflection中处理HashMap

时间:2017-12-30 00:49:47

标签: java reflection casting hashmap

在java中有一个学校项目,使用 Reflection ,我设法处理这个主题,除了处理HashMap。

假设我们有一个Shape类,以及扩展Shape的多边形 每个多边形都继承ID和名称。以下是使用Triangle实现的简短示例:

Class Shape{
  private static int id_counter;
  protected ID;
  protected Shape(String name){
    ID = id_counter;
    id_counter++;
    this.name = name;
  }
}

Class Triangle {
{
  public Triangle(Sting name, Point[] vertices)
  {
    super(name);
    /* some operations to define Triangle vertices*/
  }
  public int getID()
  {
    return this.ID;
  }

只需要通过ID对多边形执行操作,因此我使用名为shapesHash的HashMap:

HashMap <Integer, Shape> shapesHash = new HashMap <Integer, Shape>;

当我尝试使用 Reflection 创建新形状时,事情开始变得棘手。 在Main void中,我声明如下(跳过所需的try-catch包装):

Class<? extends Shape> myClass = Class.forName("polygonName").asSubclass(Shape.class);
// String "polygonName" is given
Constructor<?> myConstructor = myClass.getDeclaredConstructor();
Object myObject = myConstructor.newInstance(name, points);
// String "name" and Points 'points' are given
Method myMethod = myClass.getMethod("getID");
Object result = myMethod.invoke(null);
shapesHash.put( (Integer) result, (Class<? extends Shape>) myClass);   

问题在于我试图弄清楚要作为第二个参数放什么,
而不是(Class<? extends Shape>)myClass
我尝试了很多种类的铸造,根本没有铸造 - 但没有成功(我得到编译错误)。

在这种情况下我该怎么办?

1 个答案:

答案 0 :(得分:2)

首先,您需要在对象上调用getID

Object result = myMethod.invoke(myObject);
                                ^^^^^^^^

对于put方法的第二个参数,只需传入使用构造函数创建的对象myObject

shapesHash.put( (Integer) result, (Shape) myObject);