Java 動的コード生成を提供し、ジェネリックもサポートするツールはありますか?
たとえば、Javassist は私が必要とする種類のツールですが、ジェネリックをサポートしていません。
Java 6 Compiler API を使用する小さな lib を作成しましたが、私が知る限り、JDK に依存しています。別のコンパイラを指定する方法はありますか? それとも、Java Compiler API で呼び出す必要がある部分だけをアプリケーションに同梱するには?
Java 動的コード生成を提供し、ジェネリックもサポートするツールはありますか?
たとえば、Javassist は私が必要とする種類のツールですが、ジェネリックをサポートしていません。
Java 6 Compiler API を使用する小さな lib を作成しましたが、私が知る限り、JDK に依存しています。別のコンパイラを指定する方法はありますか? それとも、Java Compiler API で呼び出す必要がある部分だけをアプリケーションに同梱するには?
Javaassist で一般的な情報を操作して読み取ることができるようです。見る
http://www.mail-archive.com/jboss-user@lists.jboss.org/msg101222.html
[jboss-user] [Javassist ユーザーの質問] - Re: Javassist を使用したメソッドのジェネリック情報の変更 SimonRinguette Thu, 20 Dec 2007 12:22:14 -0800
これがコンパイラによってどのように実装されているかをさらに読み、最終的に探していた答えを見つけました。
あなたは間違いなくjavaassistでそれを行うことができます。重要なクラスは javassist.bytecode.SignatureAttribute です。
CtMethod から methodInfo を取得しました。Signature 属性を追加します。次のようなものでそれを行うことができます:
CtMethod method = ....
MethodInfo methodInfo = method.getMethodInfo();
SignatureAttribute signatureAttribute = new
SignatureAttribute(methodInfo.getConstPool(),
"()Ljava/util/List<Ljava/lang/String;>;");
methodInfo.addAttribute(signatureAttribute);
内部のジェネリックを使用して署名を読み取ることにもっと興味がある場合は、methodInfo.getAttribute(SignatureAttribute.tag) を使用できます。
これが役に立ったことを願っています。
バイトコードの記述に慣れている場合、ASMはその種のライブラリとして非常に優れています。これにより、クラスファイル形式の核心について心配することなく、その場でクラスファイルを生成できます。その後、クラスローダーを使用してアプリケーションに動的にロードできます。
私の記憶が正しければ、実行時に Java コンパイラを使用するには、クラスパスに tools.jar があれば十分です。