3

書き方を検討中です


class MyClass {
  @Get
  @Set
  protected int aValue;
}

次に、クラスの get_aValue() および set_AValue() メソッドを自動的に生成します。

私はこれらの可能性を見つけました:

1a) コンパイル時。MyClass.java を個別に処理するためにアノテーション プロセッサを使用してから、新しい MyClass.java を作成し、最後にこの後者 (オリジナルを置き換えて) を残りの .java と共に使用します。

1b) コンパイル時。注釈プロセッサを使用して、元の MyClass のサブクラスである新しいクラス (get/set メソッドを使用) を含む MyClassGenerated.java ファイルを生成します。

2) 実行時。java.lang.instrument と外部ツール (BCEL など) を使用して、MyClass.class に新しいコードを織り込みます。

さて、質問は次のとおりです。サードパーティのライブラリ(ロンボクプロジェクトやBCELなど)を可能な限り使用したくないことを考慮して

a)他のアプローチがありませんか?

b) どのアプローチを使用しますか?

1a) を使用すると思います。

1b) クリーンではありません (プログラムの残りの部分では、元の MyClass の代わりに MyClassGeneradted を使用する必要がありますが、おそらく名前だけの問題です)

2) は本当に難しいです (少なくとも私にとっては)。

4

6 に答える 6

5

getter メソッドと setter メソッドを生成するだけでも大変な作業のように思えます。eclipses getter および setter generator を使用しない理由:

ゲッターとセッターのスクリーンショットを生成する
(出典: eclipse-blog.org )

于 2010-07-13T11:40:03.760 に答える
4

このルートをたどりたい場合は、これが最善のアプローチだと思います。

1c) コンパイル時。クラスを通常どおりコンパイルし、APT アノテーション プロセッサを使用して.classファイル (ソース ファイルではない) を変更し、適切な get および set メソッドをバイトコードに追加します。

このようにして、ソースは元の状態に保たれ、一時ファイルをいじる必要がなくなり、実際にコンパイルされたクラスは希望どおりになります。


それでも、これはハンマーを使ってナットを開けています。それは可能ですが、誰かがそれを受け取って実行javacすると、ゲッターとセッターのないクラスを取得するという意味で、コードは厳密には Java ではありません。これにより、すべての行番号が台無しになるため、デバッグが困難になります。また、注釈プロセッサで正しいことを行ったことを確信していない限り、ゲッターとセッターのソースを確認することさえできません。間違いを正すこと。静的分析ツールは、属性が使用されていないことなどを示します。

私は一般的なコンセンサスに賛成です。すべての IDE が提供する方法を使用して、ソース ファイルにそれらを生成するだけです。これは注釈を書くよりもほとんど時間がかからず、そこにいるすべての開発者とツールによって理解されています。Javaにはプロパティがありません - それを乗り越えてください。:-)

于 2010-07-13T11:46:14.670 に答える
3

実際には、私は通常、アプローチ 3 を使用します。フィールドをコーディングし、Eclipse IDE を使用してゲッター メソッドとセッター メソッドを自動生成します。(netbeans と IntelliJ には同様の機能が必要です)

IDE の自動生成ツールを使用すると、生成された getter/setter メソッドの可視性を定義したり (setter の可視性を非公開に制限したい場合があります)、メソッド本体に追加のコードが必要な場合はテンプレートを編集したりすることもできます。

于 2010-07-13T11:40:58.020 に答える
3

Project Lombokは、実装は異なりますが、ほぼ正確にあなたが望むものです。

于 2011-04-27T04:30:24.760 に答える
2
  • a)それをサポートするJVM言語(Javaと互換性がある)を使用できます
  • b) Scala で書きます

真剣に、言語に苦痛を感じていて、バイト コード ウィーバーや外部ライブラリなどの松葉杖を使いたくない場合は、より環境に優しい牧草地を探す必要があります。

于 2010-07-13T11:40:39.143 に答える
1

別の明白な選択肢が提案されていない理由はわかりませんが、インターフェイスを定義するだけで、指定されたセッター、ゲッター、および必要な内部フィールドを実装するライブラリを使用する別のアプローチを検討します。

したがって、次のように指定します

パブリック インターフェイス Bean { public int getX(); public void setX(int 値); }

そのためにライブラリに型をインスタンス化するように依頼します(そして、型のインスタンスを作成するための便利なメソッドかもしれません)。必要に応じて、アノテーションを使用してさらに構成することもできますが、get/set スタイル Bean の場合はそうではありません。

これは、(2) とは異なります。何かが欠けていない限り、そのままでは機能しません。つまり、コンパイル時にメソッドを使用できる必要があります。そして、それがインターフェースを使用することで解決することです。コード生成が必要になりますが、自動化できます。

そのようなライブラリが存在することを期待しますが、存在しない場合でも、バイトコード生成ライブラリ (asm、cglib、janino、javassist など) を使用して汎用目的のライブラリを作成することは非常に可能です。

単純なユースケースのためにそのようなライブラリを書くことはもちろん重いですが、それを使用することは理にかなっているように思えます。

...そして、それが何であれ、特定のケースを解決するにはIDEを使用するのが最も簡単かもしれません。:-)

于 2010-07-13T20:11:33.117 に答える