如果我将函数名称存储为哈希表中的字符串。
有没有办法通过存储的字符串访问函数?
编辑恐怕我在 CLDC1.1/MIDP2.0 上工作的平台不支持反射。
任何可能的解决方法?
只需使用很长的 else-if 列表:
[...]
} else if ("foo".equals(function)) {
target. foo();
} else if ("bar".equals(function)) {
target. bar();
[...]
(虽然我通常不喜欢在源代码中尝试垂直对齐,但我认为在这种情况下这是非常值得的。)
将仿函数存储在映射中是一种替代方法,但对于许多 MIDP 应用程序而言,可能会过多地增加对象大小。
Class.forName() 和 newInstance() 应该在 MIDP 1.1 上,并且可能有用。由于您没有完全反射,您可以创建一个包装所有函数调用并调用它们的类。这假设您事先知道所有的函数调用。
除非您进行静态调用,否则您将需要对所有对象的引用。有点乱,但会完成工作。
public Object invoke(String name, Object[] args) {
Object f = functionMap.get(name);
if("f1".equals(name)) {
return ((SomeInterface1)f).someFunction1((SomeArg0) args[0]), ...);
} else if ("f2".equals(name)) {
return ((SomeInterface2)f).someFunction2((SomeArg0) args[0]), ...);
}...{
} else if ("fN".equals(name)) {
return ((SomeInterfaceN)f).someFunctionN((SomeArg0) args[0]), ...);
}
}
给定一个函数名称,您可以使用反射来访问该方法。除了函数的名称,您还需要知道它的类,并且拥有(或者如果它有一个 noarg 构造函数或者您知道要传递给构造函数的参数,则通过反射创建)一个实例(如果该方法不是静态的)并且您必须知道传递给它所需的参数。
另一种选择是使用 Method 类作为指向函数的指针。它的优点是知道它的类,知道它的参数要求。它的缺点是不可序列化。
编辑:没有办法通过仅将其名称作为字符串来访问Java中的方法而无需反射。如果您想要一个指向方法的替代指针,您可以使用一个匿名内部类来调用您想要实现已知接口的方法并将其传递给您的地图。这不适合作为地图的键,但它可以作为地图中的值。
我还没有尝试过javame上的反射,但是在javase上你可以使用反射来动态调用一个方法。
以下片段摘自:http: //java.sun.com/developer/technicalArticles/ALT/Reflection/
import java.lang.reflect.*;
公共类方法2 { public int add(int a, int b) { return a + b; }
public static void main(String args[])
{
try {
Class cls = Class.forName("method2");
Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
Method meth = cls.getMethod(
"add", partypes);
method2 methobj = new method2();
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47);
Object retobj
= meth.invoke(methobj, arglist);
Integer retval = (Integer)retobj;
System.out.println(retval.intValue());
}
catch (Throwable e) {
System.err.println(e);
}
}
}
编辑:而不是使用 if..then..else 你可能想要实际传回一个数字,并使用一个开关,因为它更容易阅读,IMO。
但是,无论如何,鉴于 JavaME 的限制,这可能是您唯一的选择。
我在Hecl中处理类似的问题,这是一个在 J2ME 上运行的解释器。这在某种程度上取决于您要处理多少个字符串,但一种有效的方法是使用散列来查找整数,然后在 switch 语句中使用它,而不是 if/then 语句的大列表。顺便说一句,欢迎您使用 Hecl 源代码;它在自由的 Apache 许可下可用。