質問

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

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

役に立ちましたか?

解決

はい、そのクラスファイルが最後にバイト配列であるバイトコードで理論的にはそうすることが可能!あなたは、リフレクション経由でオブジェクトをインスタンス化するために使用することができ、クラスのインスタンスを取得するメソッドdefineClass(文字列、バイト[]、int型、int)を使用することができます。

実際には、あなたは CGLIB のようなものを使用することができますか<のhref = "のhttp://www.csg .is.titech.ac.jp /〜千葉/ Javassistの/」のrel = "noreferrer"> javaassist でます。

また、ファイルをロードし、その後、コンパイラを呼び出し、ファイル内のJavaコードを生成する長い道のりを使用することができます。

他のヒント

あなたは動的に ASM

を使用してクラスを生成することができます

あなたは、そのファイル上でJavaコンパイラを呼び出し、動的に実行中のアプリケーションにそのクラスをロードするクラスローダを使用して、その後、ファイルに出て、新しいクラスのコードを書くことで、これを行うことができます。 Apache Tomcatには、そのJSPページに対してこれを行います。それは、コードを受け取り、それにいくつかの変更を行い、それは、その後、ファイルシステムに書き込み、それをコンパイルしたクラスの真ん中にtry / catchブロックでそれをラップし、かつ取得し、リクエストを処理するためにそれを訴えるためにクラスローダを使用しています。

それが可能であることを確認してください。例えば、この記事を参照してください。

おそらく、(追加のライブラリを必要としないという点で)の最も簡単なの解決策は、<のhref = "http://java.sun.com/javase/6/docs/apiを使用することです/javax/tools/JavaCompiler.html」のrel = 『nofollowをnoreferrer』> JavaコンパイラのAPIそれは、Java 6が付属していますをあなたはただ単に)、.javaファイルを生成することができるようにコンパイルしてからClass.forNameのを(実行しますます。

おそらく少しやり過ぎ、のApache BCELする(バイトコードエンジニアリングライブラリ)に使用することができます実行時にclassファイルを作成します。

私はそれを自分自身を試していないが、

、おそらく、人はそれをロードし、クラスを作成し、実行時にそれをインスタンス化できます。

はい、それが可能である。

あなたは、実行時に Javassistのに持つクラスを作成することができますクラスの本体を定義し、新しいクラスをコンパイルJavassistの作ります。

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

Javassistのは、JBoss上で使用され、私はそれが良い参考だと思うされています)。

と同じではなく、このように(ただし、それははるかに困難だ、 BCEL を用いて達成することができます)が生成されている内容をより詳細に制御を持っています。

あなたがしなければならない場合は、

あなたは、おそらくのJRuby、またはJPythonのかGroovyの持つそのような何かを行うことができます。

あなたは BCEL のを見て可能性があり、特に自虐感じている場合。

あなたはJavaとメタプログラミングをしたい場合は、 Groovyのに使用します。

ASM には、Javaのための最低レベルのバイトコードのライブラリである、私は考えます。それは、それは非常に難しいだけでなく、非常に強力になります。私は実際にどのようにバイトコード生成を理解するために( PDF の)ASMのドキュメントを読んでお勧めしますJavaで動作します。資料には、また、クラスローダ(右行うには別のハードのトピック)でバイトコードをロードする方法について説明します。

その後、あなたはそれがあなたの人生が容易になります場合は、より高いレベルのライブラリのいずれかを使用して、彼らは何をすべきかを理解することがあります。そのような生成プロキシとして多くの場合については、 CGLIB には有用と使用が簡単です。より多くの電力については、多くが「 Javassistのの(Iの避難所を言及していますtはそれを使用 - CGLIBとASMは私のために良いされている)。

<のhref = "https://stackoverflow.com/questions/616532/on-the-fly-in-memory-java-code-compilation-for-java-5-andについてここ最近の質問がありました-java-6" >あなたがソースコードを生成するために管理した後、あなたに何をすべきかのヒントを与える必要があり、メモリ内のコンパイルするます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top