检查类是否包含方法

时间:2013-01-11 13:03:52

标签: java methods

我有一个抽象类来创建工具(如插图笔,选择等)。 我们的想法是,如果用户愿意,可以轻松创建新工具。

有些工具有一个名为“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;

}

3 个答案:

答案 0 :(得分:2)

我认为更好的解决方案是检查给定对象的类是否实现了某个接口。

但是,要调用draggingSelection方法,请在您正在测试的对象上执行此操作:

activeTool.draggingSelection()

答案 1 :(得分:2)

可以通过反射来做到这一点,但更好的解决方案是拥有一个具有所有相关方法的界面:

public interface SelectionAware {
  public void draggingSelection(SelectionEvent e);
}

一旦你有了这个,你有(至少)两种选择来使用它:

  1. 让您的工具实现该界面并使用myTool instanceof SelectionAware后跟强制转换来调用该方法
  2. 让该工具在某个适当的init方法中明确地将自己注册为侦听器。
  3. 选项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);
}