あなたは非標準の注釈、どのような理由のために使用します(または定義する)ようにしてください。どのように再帰的なアノテーションのでしょうか?

StackOverflow https://stackoverflow.com/questions/730240

  •  06-09-2019
  •  | 
  •  

質問

問題はそれをすべて伝えます。

専門家のために、以降のコンパイラがいない間のSun Java 5コンパイラは、再帰的な注釈(langspecに反する)を受け入れる理由があるのでしょうか?私はの再帰的な注釈に対する引数の何ができるか、を意味します。

編集ます:

の再帰的な注釈のようなものです
@Panel(layout=BorderLayout.class,
    nested={
        @Panel(region=NORTH, layout=FlowLayout.class, ...)
        @Panel(region=SOUTH, layout=FlowLayout.class, ...)
    }
)
役に立ちましたか?

解決

まず - 私はあなたが再帰的な注釈によって何を意味するかわかりません。 あなたは、同じタイプの他の注釈への参照を含めることができ、注釈を意味するのですか?

のようなもの
@Panel(layout=BorderLayout.class,
    nested={
        @Panel(region=NORTH, layout=FlowLayout.class, ...)
        @Panel(region=SOUTH, layout=FlowLayout.class, ...)
    }
)

(それが可能だった場合、私はそれを使用したい場所の一例だろう...)

カスタム注釈(およびプロセッサ)の私の使用について:コード生成

http://code.google.com/p/javadude/wiki/を参照してください。注釈する

たとえば、JavaBeanプロパティ

@Bean(
    properties={    
      @Property(name="name"),
      @Property(name="phone", bound=true),
      @Property(name="friend", type=Person.class, kind=PropertyKind.LIST)
    }
)
public class Person extends PersonGen {
    // generated superclass PersonGen will contain getters/setters
    //    field definitions, property change support...
}

またはミックスの例

package sample;

import java.util.List;

public interface IFlightAgent {
    List<IFlight> getFlight();
    void reserve(IFlight flight);
}

public interface ICarAgent {
    List<ICar> getCars();
    void reserve(ICar car);
}

public interface IHotelAgent {
    List<IHotel> getHotels();
    void reserve(IHotel hotel);
}

package sample;

import com.javadude.annotation.Bean;
import com.javadude.annotation.Delegate;

@Bean(delegates = {
    @Delegate(type = IHotelAgent.class,
              property = "hotelAgent",
              instantiateAs = HotelAgentImpl.class),
    @Delegate(type = ICarAgent.class,
              property = "carAgent",
              instantiateAs = CarAgentImpl.class),
    @Delegate(type = IFlightAgent.class,
              property = "flightAgent",
              instantiateAs = FlightAgentImpl.class)
    }
)
public class TravelAgent extends TravelAgentGen
    implements IHotelAgent, ICarAgent, IFlightAgent
{
    // generated superclass TravelAgentGen will create instances
    //   of the "instantiateAs" classes and delegate the interface
    //   methods to them
}

の?Javaでアノテーション処理の欠点をhref="https://stackoverflow.com/questions/687553/the-drawbacks-of-annotation-processing-in-java">、私を参照してください。その使用といくつかの潜在的な問題のためにそれに答えます。

他のヒント

それはOracle WebLogic Serverののにnoreferrer"> ここを定義し、アノテーションの完全なリストがあります。特に、私は彼らのポリシーアノテーションは、ほとんどをを使用して終了します、それは彼らのセキュリティモデルはのオフに基づいているものだからです。あなたは自分のドキュメントページにその詳細な例を見ることができます。

私は、再帰的な注釈聞いたことがない。

私は、RPC呼び出し、または特定の初期化手順でキャッシュのように、再帰プロセスのターゲットとしてクラスフィールドをマークするために最も通常、非標準のアノテーションを使用してください。 私は...しかし、再帰的な注釈の必要性がなかったと注釈が、クラス定義時に処理する必要があるように、標準初期化子の準備ができている前に、私は、その潜在的な問題があると思います...私がメインだと思いました基本型に注釈の内容を制限する理由...

私はあなたが禁止されていない場合は(コンパイルや実行時)無限ループにつながる可能性がある事故によって書き込み可能性のある特定の病的な場合よりも、一般的に他の再帰的な注釈を許可に対する任意の良い引数を知りません。

javacは、それは仕様が必要とするものであるという理由だけで、再帰的な注釈の定義を禁止しています。どのような仕様は、が(JDK 7のためと言う、)JLSの将来のアップデートで言うべきことは別の問題です。

だから、読んでために投票してくださいます:

http://bugs.sun.com/view_bug.do?bug_id=6264216

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