如果我有职能名称的储存如串在一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许可证。

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