在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
我尝试了很多种类的铸造,根本没有铸造 - 但没有成功(我得到编译错误)。
在这种情况下我该怎么办?
答案 0 :(得分:2)
首先,您需要在对象上调用getID
:
Object result = myMethod.invoke(myObject);
^^^^^^^^
对于put
方法的第二个参数,只需传入使用构造函数创建的对象myObject
!
shapesHash.put( (Integer) result, (Shape) myObject);