Java方法选择器?

Java方法选择器?,java,Java,我来自Objective-C背景。在Objective-C中,可以使用@selector变量存储对方法的引用,例如@selector(terminate)。然后,您可以简单地在对象上“应用”这些选择器,从而执行选择器描述的方法 现在,我必须用Java编程。Java中有类似的东西吗?还是解决办法 编辑:基本上,我正在创建一个CLI程序。当我读入命令时,我必须将命令映射到某些方法。我考虑创建一个字典,将命令与方法选择器相关联。匿名内部类类似于没什么好东西。使您能够执行类似操作的唯一方法是反射: pu

我来自Objective-C背景。在Objective-C中,可以使用
@selector
变量存储对方法的引用,例如
@selector(terminate)
。然后,您可以简单地在对象上“应用”这些选择器,从而执行选择器描述的方法

现在,我必须用Java编程。Java中有类似的东西吗?还是解决办法


编辑:基本上,我正在创建一个CLI程序。当我读入命令时,我必须将命令映射到某些方法。我考虑创建一个字典,将命令与方法选择器相关联。

匿名内部类类似于没什么好东西。使您能够执行类似操作的唯一方法是反射:

public class ReflectionExample {
    private static class A {
        public void foo() {
            System.out.println("fooing A now");
        }
    }

    public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException,
            IllegalAccessException, InvocationTargetException {
        Method method = A.class.getMethod("foo");
        method.invoke(new A());
    }
}
然后只能对同一类(或子类)的对象调用Method.invoke

编辑:为了解决您的确切问题,我认为您最好为每个命令创建一个类。这些类中的每一个都可以实现一个接口,该接口将包含执行命令的方法,并且可能还包含一个用于命令名称的字符串getter。然后可以使用命令实例填充集合


这种方法的唯一危险是添加了一个新的命令类,而忘记了创建它的实例。我发现避免这种情况的最好方法是使用枚举,每个命令有一个成员。要创建实例,可以迭代枚举值,并使用开关大小写创建实例。一些IDE(如Eclipse)会在枚举实例未包含在开关中时生成警告或错误,如果您忘记创建命令实例,该警告或错误会立即通知您。

Hm,我希望能够将方法名称存储在字符串中,或者类似的内容。使用匿名内部类看起来并不有趣,它肯定不有趣。但这是最接近的事情了,除非有其他阻碍。。。内部类ftw。对于所需的每个不同方法选项,创建一个内部类,然后传入内部类的相关实例。+1@Michael。我同意-不惜一切代价避免复杂的if-else结构!如果您非常想使用字符串,一种方法是创建一组内部类,每个选项对应一个要调用的方法,然后创建一个映射,将“方法名”作为字符串映射到调用该方法名的相关内部类实例。请注意,反射调用的性能非常糟糕。这是一个很好的观点。另外,它破坏了类型安全性,是一个安全问题(因此出现了SecurityException)。是的,但还不足以保证它在可以增加价值的地方使用。它过去很差,但在现代JavaVM上要快得多。除此之外,大多数ORM都大量使用反射,所以它不会那么慢。如果可能的话,为您正在解决的问题添加一个摘要对您来说是很有趣的。也许有一种更像Java的方法可以解决这个问题,但您还没有考虑。谢谢-我已经更新了我的答案,提出了一个设计建议。可能是