17

Java では、アプリケーションの実行中にオンザフライでクラス定義を作成し、そのクラスのオブジェクトを作成することは可能ですか?

たとえば、実行中のアプリケーションは、新しいクラスに含めるクラス メンバーのリストを含むテキスト ファイルを読み取ります。次にアプリケーションは、メンバーのリストに基づいてクラス定義を定義し、それをインスタンス化します。

4

11 に答える 11

11

はい、理論的にはクラスファイルはバイトコードであり、最後はバイト配列です! その後、メソッド defineClass(String, byte[], int, int) を使用して、リフレクションを介してオブジェクトをインスタンス化するために使用できる Class インスタンスを取得できます。

実際には、CGLibjavaassistなどを使用できます。

ファイルに Java コードを生成し、コンパイラを呼び出してからファイルをロードするという長い方法を使用することもできます。

于 2009-04-23T13:56:42.910 に答える
2

ASMを使用してクラスを動的に生成できます

于 2009-04-23T13:59:07.383 に答える
1

ASMはJava用の最低レベルのバイトコードライブラリだと思います。それはそれを非常に難しくしますが、また非常に強力にします。Javaでのバイトコード生成がどのように機能するかを実際に理解するには、ASMのドキュメント(PDF )を読むことをお勧めします。このドキュメントでは、クラスローダーにバイトコードをロードする方法についても説明しています(正しく実行するためのもう1つの難しいトピック)。

その後、あなたの生活が楽になるのであれば、より高いレベルのライブラリの1つを使用して、それらが何をするのかを理解することができます。プロキシの生成など、多くの場合、CGLIBは便利で使いやすいです。より強力なものとして、多くの人がJavassistについて言及しています(私はそれを使用していません-CGLIBとASMは私にとって良いものでした)。

于 2009-04-23T14:22:44.190 に答える
1

これを行うには、新しいクラスのコードをファイルに書き込んでから、そのファイルで Java コンパイラを呼び出し、クラスローダーを使用してそのクラスを実行中のアプリケーションに動的にロードします。Apache Tomcat は、JSP ページに対してこれを行います。コードを取得し、それにいくつかの変更を加え、クラスの途中で try/catch ブロックにラップします。次に、ファイルシステムに書き込み、コンパイルし、クラスローダーを使用して要求を処理します。

于 2009-04-23T13:54:21.200 に答える
1

確かにそれは可能です。たとえば、この記事を参照してください。

于 2009-04-23T13:57:07.747 に答える
1

おそらく、(追加のライブラリを必要としないという点で)最も簡単な解決策は、Java 6 に付属のJava コンパイラ APIを使用することです。.java を生成し、コンパイルして、Class.forName() を実行するだけです。

于 2009-04-23T15:03:05.763 に答える
0

ここに、メモリ内コンパイルに関する最近の質問がありました。これは、ソースコードを生成した後に何をすべきかについてのヒントを与えるはずです。

于 2009-04-23T16:34:50.867 に答える
0

Java とメタプログラミングが必要な場合は、Groovyを使用してください。

于 2009-04-23T14:09:28.323 に答える
0

少しやり過ぎかもしれませんが、実行時にファイルを作成するためにApache BCEL (Byte Code Engineering Library) を使用できます。class

私自身は試したことはありませんが、クラスを作成してロードし、実行時にインスタンス化することはおそらく可能です。

于 2009-04-23T14:00:51.183 に答える
0

はい、可能です。

クラスの本体を定義し、javassist に新しいクラスをコンパイルさせることにより、実行時にJavassistを使用してクラスを作成できます。

Javassist には、クラスの定義に基づいてバイトコードを作成するカスタム コンパイラがあります。物事を処理するいくつかの特定の方法がありますが、このライブラリを使用するのは非常に簡単で直感的です。

Javassist は JBoss で使用されており、これは参考になると思います :)

同じことがBCELで実現できますが、はるかに困難です (ただし、この方法では、生成されるものをより細かく制御できます)。

于 2009-04-23T14:00:54.553 に答える
0

必要に応じて、JRuby、JPython、または Groovy を使用して、おそらくそのようなことを行うことができます。

特に自虐的だと感じている場合は、BCELを見ることができます。

于 2009-04-23T14:03:33.987 に答える