我有一个抽象类来创建工具(如插图笔,选择等)。 我们的想法是,如果用户愿意,可以轻松创建新工具。
有些工具有一个名为“draggingSelection”的方法。 我想知道是否有办法检查一个类是否有该对象,如果是,则运行它。 (在这种情况下,draggingSelection返回一个布尔值)
到目前为止,我可以判断该方法是否存在。 我只是无法得到它的运行方法。 我试着调用但是我失败了。我的方法没有要求任何参数。 可以提供帮助。
public boolean draggingSelection() {
Method[] meths = activeTool.getClass().getMethods();
for (int i = 0; i < meths.length; i++) {
if (meths[i].getName().equals("draggingSelection")) {
// how can i run it?
//return meths[i].draggingSelection(); // wrong
}
}
return false;
}
答案 0 :(得分:2)
我认为更好的解决方案是检查给定对象的类是否实现了某个接口。
但是,要调用draggingSelection
方法,请在您正在测试的对象上执行此操作:
activeTool.draggingSelection()
答案 1 :(得分:2)
你可以通过反射来做到这一点,但更好的解决方案是拥有一个具有所有相关方法的界面:
public interface SelectionAware {
public void draggingSelection(SelectionEvent e);
}
一旦你有了这个,你有(至少)两种选择来使用它:
myTool instanceof SelectionAware
后跟强制转换来调用该方法或 init
方法中明确地将自己注册为侦听器。选项1更接近您的尝试,但限制了该接口的使用,并且不是真正干净的代码(因为您的代码需要“猜测”某些工具是否实现某些接口)。
选项2可能稍微多一些工作(在何时/何时注册/取消注册监听器?...),但绝对是更清洁的方法。它还具有以下优点:听众不仅限于使用工具:任何东西都可以注册这样的听众。
答案 2 :(得分:1)
public interface Draggable {
public boolean draggingSelection(int foo, int bar);
}
然后当你有一个使用这种方法的课时,只需添加implements Draggable
。例如:
public class Selection implements Draggable {
public boolean draggingSelection(int foo, int bar) {
(insert code here)
return baz;
}
(insert rest of code here)
}
因此你的例子是:
if (activeTool instanceof Draggable) {
((Draggable)activeTool).draggingSelection(foo, bar);
}