在Reflection中处理HashMap

问题描述 投票:0回答:1

在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 我尝试了很多种类的铸造,根本没有铸造 - 但没有成功(我得到编译错误)。

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

java reflection casting hashmap
1个回答
2
投票

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

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

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

shapesHash.put( (Integer) result, (Shape) myObject);   
© www.soinside.com 2019 - 2024. All rights reserved.