プログラムの実行中に関数を宣言するにはどうすればよいですか?
-
05-07-2019 - |
質問
これは次のようなものです 反射 ここでは、メソッドへのプリコンパイルされたポインタではなく、単にその名前によってメソッドを呼び出すことができます。
JavaScript と同様に、次のことができます。
var fun = function(){ alert("Hello World!"); }
fun();
Java/J2ME ではそのようなことは可能ですか?どうやって?
解決
j2meのインタープリターが必要な場合は、Heclをチェックアウトできます。 http://www.hecl.org
J2MEの通常のJavaでできる「派手な」ことはほとんどできません。別の方法は、必要な関数を呼び出す一連のif / elseifですが、それを行うコードを作成するには、事前にそのことを知っておく必要があります。
他のヒント
この機能を模倣する1つの方法は、戦略クラスを作成することです。
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
Javadoc によれば、これは非常に便利なインターフェイスであり、「スレッドによって実行されるインスタンスを持つクラスによって実装されるべきである」とされています。 Runnable
もちろん、スレッドよりもはるかに多くの用途に使用でき、一般に (JVM やその他の場所で) 「実行できるもの」として使用されます。これは Javascript の関数によく似ています。もちろん、引数を渡したい場合は独自のインターフェイスを作成する必要がありますが、それらは匿名で実装することもできます。たとえば、次のように使用します。 @イマジストさん 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!"
編集: もちろん、これはリフレクションとは何の関係もありませんが、あなたの例にもリフレクションはなく、単なる匿名関数です。
少なくともいくつかの方法があります:
BCEL を使用して、実行時にクラスを作成できますが、バイトコードを自分で作成する必要があります。また、バイトコードが不審に見える場合、JVMのベリファイアはクラスを拒否する可能性があります。非常に簡単なソリューションではありませんが、実行可能です。
SunのJava 6実装にはJavaScriptインタープリターである Rhino が含まれているため、おそらく必要なことを実行できます。少しのJavaScriptを使用したい場合。
これについてはあまりよくわかりませんが、JDKがインストールされている場合は、Javaプログラムから javac
を呼び出すことができます。 javac
の出力は、カスタムの ClassLoader
クラスを使用して実行時にロードできます。