这有点像反射,您可以简单地通过名称来调用方法,而不是通过预编译的指针来调用它。
就像在 JavaScript 中一样,您可以:
var fun = function(){ alert("Hello World!"); }
fun();
在 Java/J2ME 中是否可能发生类似的事情?如何?
如果您想要 j2me 的解释器,您可以查看 Hecl:http ://www.hecl.org
您绝对不能在 J2ME 中用普通 Java 做大部分“花哨”的事情。另一种方法是一系列 if/elseif,然后调用您想要的函数,但您仍然必须提前知道这一点,以便您可以编写执行此操作的代码。
模仿此功能的一种方法是创建一个策略类。
interface Function
{
Object call(Object[] arguments);
}
要执行您的建议,只需执行以下操作(更详细一点,因为 Java 通常是这样):
static class Fun implements Function
{
public Object call(Object[] arguments)
{
System.out.println("Hello, world");
return null;
}
}
Function fun = new Fun();
fun.call(null);
根据具体情况,您可能可以使用更好的类型或泛型来代替Object
and Object[]
(在这种情况下,我使用它们是为了获得最大的灵活性,但它们在类型检查方面并没有给您太多帮助,因此并不理想)。
有关更多信息,请查看策略设计模式。
获得类似 Javascript 闭包的常用方法是使用匿名内部类。它更加冗长,但它可以让你做几乎相同的事情。
Runnable r = new Runnable(){
public void run(){
System.out.println("Hello, world!");
}
};
r.run(); // Prints "Hello, world!"
您甚至可以在封闭方法中引用变量,如果它们是最终的:
public static Runnable makeGreeter(final String who) {
return new Runnable() {
public void run() {
System.out.println("Hello, " + who + "!");
}
};
}
// ... elsewhere in your program...
Runnable r = makeGreeter("world");
r.run(); // "Hello, world!"
这是从一开始就在 Java 中的标准内容。Runnable
是一个非常方便的接口,根据 Javadocs,“应该由其实例打算由线程执行的任何类实现”。Runnable
当然,不仅可以用于线程,而且通常(在 JVM 和其他地方)用作“可以执行的东西”——很像 Javascript 中的函数。当然,如果你想传递参数,你必须创建自己的接口,但这些也可以匿名实现。例如,使用@Imagist 的Function
界面:
interface Function {
Object call(Object[] arguments);
}
// ...
Function helloSayer = new Function(){
public Object call(Object[] args){
System.out.println("Hello, " + args[0] + "!");
}
};
helloSayer.call(new Object[]{ "world" }); // "Hello, world!"
编辑:当然,这与反射无关,但在您的示例中也没有反射 - 只是一个匿名函数。
您是在动态创建方法还是反射之后?
第一个您不能在 Java 中执行,但您可以使用解释器(如果您想要 Java,则为BeanShell )。