如何在程序执行期间声明一个函数?
-
05-07-2019 - |
题
这类似于反思,您可以在其中调用方法只是通过它的名字,而不是它的预编译指针。
与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
和 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!"
编辑:当然,这与反射无关,但你的例子中没有任何反映 - 只是一个匿名函数。
不隶属于 StackOverflow