2

这有点像反射,您可以简单地通过名称来调用方法,而不是通过预编译的指针来调用它。

就像在 JavaScript 中一样,您可以:

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

在 Java/J2ME 中是否可能发生类似的事情?如何?

4

5 回答 5

2

如果您想要 j2me 的解释器,您可以查看 Hecl:http ://www.hecl.org

您绝对不能在 J2ME 中用普通 Java 做大部分“花哨”的事情。另一种方法是一系列 if/elseif,然后调用您想要的函数,但您仍然必须提前知道这一点,以便您可以编写执行此操作的代码。

于 2009-09-11T15:24:53.507 回答
2

模仿此功能的一种方法是创建一个策略类。

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);

根据具体情况,您可能可以使用更好的类型或泛型来代替Objectand Object[](在这种情况下,我使用它们是为了获得最大的灵活性,但它们在类型检查方面并没有给您太多帮助,因此并不理想)。

有关更多信息,请查看策略设计模式

于 2009-09-11T15:44:43.977 回答
2

获得类似 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!"

编辑:当然,这与反射无关,但在您的示例中也没有反射 - 只是一个匿名函数。

于 2009-09-11T20:56:47.717 回答
1

您是在动态创建方法还是反射之后?

第一个您不能在 Java 中执行,但您可以使用解释器(如果您想要 Java,则为BeanShell )。

于 2009-09-11T15:12:59.530 回答
1

至少有几种方法:

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

Sun 的 Java 6 实现包括JavaScript 解释器Rhino,因此如果您愿意使用一点 JavaScript,也许可以做您需要的事情。

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

于 2009-09-11T15:53:16.517 回答