ハッシュテーブルに格納されている文字列を経由して機能へのアクセス
質問
私はハッシュテーブル内の文字列として格納された関数名を持っている場合。
保存された文字列を使用して機能にアクセスする方法はありますか?
EDIT
私は私がCLDC1.1 / MIDP2.0に取り組んでいることをプラットフォームがリフレクションをサポートしていません怖い。
任意の回避策は可能?
解決
ただ、他の-IFSの大きな長いリストを使用します:
[...]
} else if ("foo".equals(function)) {
target. foo();
} else if ("bar".equals(function)) {
target. bar();
[...]
(私は一般的にソースに垂直アラインメントを試みて好きではないが、私はこのようなケースでは、それはそれだけの価値だと思います。)
マップでファンクタを格納することは選択肢である、BUは、多くの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コンストラクタを持っているか、あなたはパラメータがコンストラクタに渡すために知っている場合や反射を経て作成)そのクラスを知って、そして持っている必要がありますインスタンス(メソッドが静的でない場合)、あなたパラメータを知っている必要があり、それに合格する必要がありました。
別のオプションは、関数へのポインタの方法のクラスを使用することです。それは、そのクラスを知って、そのパラメータの要件を知っているという利点を有しています。これは、直列化されていないという欠点を持っています。
編集:ちょうど文字列としてその名前を持つことにより、反射せずにJavaでメソッドにアクセスする方法はありません。あなたがメソッドの代わりのポインタをしたい場合、あなたはその実装に既知のインタフェースをしたいメソッドを呼び出す匿名の内部クラスを使用して、マップにあることを渡すことができます。これは、マップのキーとして適切ではないだろうが、それはマップ内の値として動作します。
私はJavaMEの上の反射を試していないが、使用するJavaSEにあなたが動的にメソッドを呼び出すためにリフレクションを使用することができます。
次のコードは、から取られます。 http://java.sun.com/developer/technicalArticles/ALT/Reflection/
import java.lang.reflect.*;
パブリッククラス方法2 { 公共int型の追加(int型B、int型) { + 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);
}
}
}
編集: むしろIMO、読みやすくなりますよう、あなたが、実際に番号をバック渡したい、とスイッチを使用することができif..then..else使用します。
しかし、かかわらず、それはおそらくJavaMEのの限界を与え、あなたの唯一のオプションです。
私は、J2MEで実行されていることを通訳、 HECL社の中で同様の問題に対処します。それは一種のあなたがに対処したいどのように多くの文字列に依存しますが、作品が代わりのif / then文の大きなリストの、整数をルックアップするためにハッシュを使用して、switch文でそれを使用することを一つの方法。ところで、あなたはHECL社のソースコードを使用することを歓迎しています。それはリベラルApacheライセンスの下で利用可能です。