访问的功能,通过串存在Hashtable
题
如果我有职能名称的储存如串在一Hashtable.
有没有办法访问的职能通过所储存的串?
编辑
我怕的平台,我的工作CLDC1.1/MIDP2.0不支持的反思。
任何解决方法的可能吗?
解决方案
只是使用一个很大的长长的名单的其他假设:
[...]
} else if ("foo".equals(function)) {
target. foo();
} else if ("bar".equals(function)) {
target. bar();
[...]
(虽然我通常不喜欢企图纵对在来源,我认为在这样的情况下,它是值得的。)
存储函子在该地图是一种选择,卜可能会增加目尺寸太多,对许多实应用。
其他提示
的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构造函数或你所知道的参数传递给构造函数)实例(如果该方法不是静态的),你必须知道的参数需要传递给它。
另一种选择是使用的方法类作为指针的功能。它知道它的类,并且知道它的参数要求的优势。它具有不序列化的缺点。
编辑:没有办法通过仅具有它的名字作为一个字符串来访问Java中的方法没有反射。如果你想要一个替代指针的方法,你可以使用匿名内部类调用方法你要实现一个已知的接口,并传递到您的地图。这将不适合作为映射的键,但它的工作如在映射中的值。
我还没有尝试上的JavaME反射,但在JavaSE中可以使用反射来动态调用的方法。
下面的代码段取自: http://java.sun.com/developer/technicalArticles/ALT/Reflection/
import java.lang.reflect.*;
公共类方法2 { 公众诠释添加(INT A,INT B) { 返回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许可证。