2016-06-17 5 views
0

ジェネリックを使用している場合、コンパイル時にクラスに特定のアノテーションが含まれているかどうかを確認できますか?バインドされたタイプを指定するコンパイル時に注釈を含むパラメータ?

さまざまなHTTP呼び出しに対する応答となるラッパークラスを作成しています。

私が望むのは、このラッパークラスが、ユーザーが自分の注釈で注釈を付けられた任意の型のオブジェクトを渡すことができるようにすることです。

たとえば、次のように私のラッパークラスを指定できます

このクラスを使用するときは、私は新しいHttpResponseオブジェクトを作成し、「データ」フィールドの型を宣言することができます
public class HTTPResponse<T> { 

    private HttpStatus status; 
    private int statusCode; 
    private T data; 

    public HTTPResponse(HttpStatus status, T data) { 
     this.status = status; 
     this.statusCode = status.value(); 
     this.data = data; 
    } 

    public T getData() { 
     return data; 
    } 

    public void setData(T data) { 
     this.data = data; 
    } 

    //other getters/setters 

} 

を:

HTTPResponse<SomePOJO> response = new HTTPResponse<>(HttpStatus.OK, new SomePOJO()); 
は、

考えられるのは、このクラスを使用しようとする人は誰でも、構築中に独自のカスタムPOJOを渡すことができるということです。しかし、私は、作成中に渡されているオブジェクトに、私が作成したカスタムインターフェイスが注釈されていることを確認できるようにしたいと考えています。

例えば、私のSomePOJOクラスは、以下のように見えるためにを必要とします:

@MyCustomInterface 
public class SomePOJO() { 
    //code stuff here 
} 

SomePOJOクラスがコンパイル時に@MyCustomInterfaceでアノテートされていることを確認する方法はありますか?

私は注釈をマークして、実行時に利用できるようにしてから、HTTPResponseクラスのコンストラクタでチェックを実行することができます。しかし、私のクラスのユーザが、(コンパイル時に)できるだけ早く正しいインタフェースをPOJOにマークしていないので、HTTPResponseオブジェクトを作成する前にそれを行う必要があることを本当に知りたいです。

この場合、アノテーションは適切な方法ですか?それは何とかコンパイル時にクラスのアノテーションを確認するために、100%不可能であると私は、あなたがこれまでダウンし、それがこの作ることに成功した場合に読み取るための

HTTPResponse with public class HttpResponse<T implements MyCustomInterface> { 
    //fields, getters, setters 
} 

感謝を指定して、私のカスタムインターフェイスを実装するためにユーザーを強制すべきです!

答えて

0

上記の私のカスタムアノテーションの目的は、クラスをHTTPResponseクラスで使用できるアイテムとしてマークすることでした。難しい部分はコンパイル時にの間にこれを検証していました。

この問題に対する簡単な答えはです。マーカーインターフェイス!ジョシュアブロッホの効果的なJavaでは

、彼は書いている:

マーカーインタフェースは、マーカーの注釈の上に2つの利点があります。最初に マーカーインターフェイスは、マークされたクラスの インスタンスによって実装されるタイプを定義します。マーカーアノテーションは行いません。このタイプの が存在すると、コンパイル時にエラーをキャッチできます。 マーカーアノテーションを使用した場合、実行時までキャッチできませんでした。

したがって、上記の質問は無効です。コンパイル時にエラーをキャッチしたい場合は、マーカーアノテーションを使用しないでください。私のカスタムアノテーションをインターフェースに変更した後、私は以下のように私の限定ジェネリッククラスを指定しました:

HTTPResponse with public class HttpResponse<T implements MyCustomInterface> { 
    //fields, getters, setters 
}