2009-07-16 10 views
9

これは質問されて答えられた質問かもしれませんが、私と一緒に耐えてください。アノテーションをコードの挿入に使用できますか?

アノテーションを使用して、クラスをコンパイルするときにコードを挿入できるかどうかを知りたい。古典的な例は、オブジェクトのメンバのためのゲッターとセッターを生成することです。これは私が必要とするものではありませんが、基本的な考え方を説明するのに役立ちます。インターネット上で今

私が手の基本的な答えはノーですが、この男はそれをやった:

link text

誰もが、彼は彼が何をどうするかを知っている(と彼が実際に彼は彼の言うことをしなければいそうですか?

主なものは、コンパイルするために新しいJavaファイルを生成するために注釈プロセッサを使用しないことです。私が知っているこの技術では、私たちの目的のために働かないでしょう。 (実行時にそれを行うのも、より多くのエキゾチックな方法があります、はい、私は知っている)

おかげで

+0

彼はおそらくこれを行うことができると思いますhttp://jcp.org/ja/jsr/detail?id=269? – Chii

答えて

5

それはコンパイル時にコードを変更することはサポートされていませんが、非サポートjavacの内部APIを使用することにより可能であるように思わ、herecodeにもリンクしてhanbuy-pannoソリューションを参照するポストであります...

+0

ありがとうございます。その2番目のリンクは、私が探していたものです。今、私は彼がどのようにそれを行い、そうすることが良いか悪いかを判断することができます。 –

+0

これらのリンクは機能しなくなりました。鏡はありますか? –

1

何かが注釈を処理する必要があるので、注釈プロセッサを持つまたは反射して、実行時にコンパイル時に起こるのいずれか。

彼は最も確かに注釈プロセッサを使用しています。それは暗黙のことです。 javacコマンドは、明示的に設定されていない場合、アノテーションプロセッサのクラスパスを検索します。

彼はコンパイルするには、このコマンドを使用しているので:

javac -cp ~/development/panno/build/hanhuy-panno.jar *.java

我々は、彼が注釈プロセッサが含まれますhanhuy-panno.jarを含むようにクラスパスを変更した参照してください。

男にメールを送り、彼にコードを渡すかどうか尋ねるだけではどうですか?

+0

はい、私は彼が注釈プロセッサを使用していることを認識しています、質問は彼がそれで何をしているかです。私は彼に郵送しましたが、私はまだ返信を受けていません。ありがとうございました –

3

私は昨年something similarを探していました。注釈プロセッサまたはコンパイラを使用してクラスを変更する標準的な方法はなく、注釈APIドキュメントではデコレータを作成することを推奨しています。

ハッキングを使用して喜んでいる場合はのAdrian KuhnのプライベートAPIの使用をご覧ください。このアプローチはSunのjavacコンパイラに限られており、Eclipseコンパイラのように別のものを使用した場合は別のものを実装する必要があります。


編集:このエリアに興味がある人はProject Lombokをチェックしてください。

+0

ああ、私はあなたが特定のコンパイラに自分自身を制限することの意味を参照してください。それは問題かもしれません。応答していただきありがとうございます。 –

2

これは可能ですが、アノテーションを含むクラスを変更する必要はありません。 (リンクするトリックは、コンパイルツリーAPIを使用して生成されるバイトコードを変更します...)これはサポートされておらず、後のJava SDKではおそらく保護されます。

適切な方法は、スーパークラス、サブクラスまたはラッパークラスを生成することです。

私はgetter/setterやその他の楽しいものを生成する注釈のセットを書いています。私はスーパークラスを生成します。

はあなたが

package sample; 

import com.javadude.annotation.Bean; 
import com.javadude.annotation.Property; 
import com.javadude.annotation.PropertyKind; 

@Bean(properties={ 
    @Property(name="name"), 
    @Property(name="phone", bound=true), 
    @Property(name="friend", type=Person.class, kind=PropertyKind.LIST) 
}) 
public class Person extends PersonGen { 
} 

のようなものを行うことができますし、それがフィールド/ゲッター/セッターとバウンドプロパティをサポートしてあなたのためのPersonGenを生成しますhttp://code.google.com/p/javadude/wiki/Annotations

を参照してください。

+0

応答をありがとう、私の元の質問で述べたように、他のJavaファイルを生成することは私たちの場合には理想的な解決策ではありません。コンパイルツリーAPIを使用することは理想的ではないことに同意します。 –

+0

何らかの理由コードがうまくいかないでしょうか?コードツリーのapiはこの目的には理想的ではないだけでなく、APT文書では違法であることが明示されています。 –

関連する問題