【发布时间】:2019-11-14 22:41:13
【问题描述】:
我有两节课。
public class Shape1 extends javafx.scene.shape.Path {
public Shape1(PathElement... elements) {
super(elements);
}
}
public class Shape2 extends javafx.scene.shape.Path {
public Shape2(PathElement... elements) {
super(elements);
}
}
它们不一样。它们有不同的字段和方法,但为了简单起见,我没有提及它们。
我为每种类型的对象创建了两个数组,我只需要使用一种方法来创建它们。
ArrayList<Shape1> first_shapes = create_array(50, 50, 100, 100, Class.forName("example3.Shape1"));
ArrayList<Shape2> second_shapes = create_array(50, 100, 100, 150, Class.forName("example3.Shape2"));
public static ArrayList create_array(int X1, int Y1, int X2, int Y2, Class my_class) {
var shapes = new ArrayList<>();
shapes.add(my_class.getConstructor(PathElement[].class).newInstance(new MoveTo(X1, Y1), new LineTo(X2, Y2)));
...
return shapes;
}
代码有两个问题。
类定义不合适,因为更改类名或包名时不起作用,必须手动更改。
实际上,它根本不起作用,因为当您将对象添加到数组时它会崩溃。
奇怪的是,在上面的表格中它会显示一个错误。
参数数量错误
但如果我只使用一个参数,
shapes.add(my_class.getConstructor(PathElement[].class).newInstance(new MoveTo(X1, Y1)));
它会显示一个错误。
参数类型不匹配
这是解决我的问题的唯一方法。否则我将不得不改变整个算法。
请帮忙
谢谢
【问题讨论】:
-
除非您使用
Class.forName("SomeType")而不是SomeType.class,否则重命名问题应该根本不是问题。后一种情况应通过 IDE 的重命名功能来处理。此外,我建议改用Function<PathElement[], ? extends Shape>:这更灵活,允许编译器检查适当方法的存在,并且不需要允许反射访问包含的类。此外,它也适用于创建路径的非构造方法:create_array(X1, Y1, X2, Y2, Shape1::new);
标签: java class javafx reflection