9

Javaで自己変更コードを作成したり、遭遇したことがありますか?はいの場合は、リンクを投稿するか、単にコードを投稿してください。

4

7 に答える 7

9

自己変更コード (!) を介して自分自身を引き起こしている可能性のある悲しみの世界を無視すると、3 つのオプションがあるように思えます。

  1. Java 6 の組み込みコンパイラ サポートを使用し、クラスを書き込み/再コンパイル/再ロードします。
  2. Apache BCELバイトコード操作ライブラリを使用して、クラスを直接記述します
  3. Java 6 の組み込みスクリプト サポート (または Apache BSFを使用) を利用して、選択した JVM スクリプト言語でメソッドを記述し、これらを実行します。

上記の 3 つのうち、私の最初の選択 (要件がない場合) は、オプション 3 を検討することです。これが、開始するのに最も苦労しない方法だと思います。上記のすべてを使用しましたが、残念ながらクライアント コードへのリンクを投稿できません。

于 2009-06-26T11:09:35.103 に答える
2

bcelなどのライブラリを使用して、実行時に新しいクラス (バイト コード) を生成する (Java) コードを記述できます。これは、自己変更コードとまったく同じではありません。自己変更コードは、JVMがサポートしているものではないと思います。

実行時に新しいコードを生成する例については、clojureのソース コードを参照してください。

于 2009-06-26T11:05:16.017 に答える
1

それを実現するのは難しいはずです。ただし、実行時に新しいクラスを作成し、カスタムクラスローダーを使用してそれらをロードすることができます。コードを再度変更する場合は、クラスをリロードする必要があります。

于 2009-06-26T10:59:46.293 に答える
1

BCELから:

Byte Code Engineering Libraryは、(バイナリ)Javaクラスファイル(.classで終わるファイル)を分析、作成、および操作するための便利な可能性をユーザーに提供することを目的としています。クラスは、指定されたクラスのすべてのシンボリック情報(特に、メソッド、フィールド、バイトコード命令)を含むオブジェクトによって表されます。

于 2009-06-26T11:03:11.760 に答える
1

私はこの目的のためにこれらのオプションを見ます:

  • javaソースコードを生成し、外部javacまたは内部コンパイラツールでコンパイルします(名前を思い出せません)。また、名前付けはユーザーが担当するため、クラスの読み込みの異常を回避するために、クラス名にバージョンカウントを含めるだけです。
  • 組み込みのJavaScriptエンジンサポートを使用する
  • 一部のシナリオは、Javaプロキシを使用して解決できます

編集:私はかつて、既存のレガシーデータベースからビジネスルールを取得し、それらから一連のprintln()を含むJavaファイル(基本的にはPredicateインターフェイスの実装)を生成し、コマンドラインjavacを使用してコンパイルするJava1.4プログラムを作成しました。

于 2009-06-26T11:05:00.633 に答える
0

学部生として、私はJikesRVMに取り組むようになりました。これは、(ほとんど) Java で実装された JVM です。実行時に JIT コンパイルされます。本当に素晴らしい技術です。

于 2009-06-26T11:07:26.323 に答える
-2

いつでも動的言語を使用できます...

于 2009-06-26T11:00:47.333 に答える