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