这类似于反思,您可以在其中调用方法只是通过它的名字,而不是它的预编译指针。

与JavaScript一样,您可以:

var fun = function(){    alert("Hello World!");    }
fun();

在Java / J2ME中是否可以这样?怎么样?

其他提示

获得类似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做,但你可以使用翻译( BeanShell ,如果你想爪哇)。

至少有几种方法:

您可以使用 BCEL 在运行时创建类,但您必须自己创建字节码。如果您的字节码看起来不合适,JVM的验证程序可能会拒绝您的类。不是一个超级简单的解决方案,但可行。

Sun的Java 6实现包括 Rhino ,JavaScript解释器,所以你可以做你需要的如果你愿意使用一点JavaScript。

我对此不太确定,但我相信如果安装了JDK,您可以从Java程序中调用 javac javac 的输出可以在运行时使用自定义 ClassLoader 类加载。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top