4

このコードは有効ですか?

public abstract class A {
   protected static final String c = "my const";
}

@myAnnotation(value=A.c)
public class B extends A {

}

EclipseJDK 1.6.0.23 ではこれを受け入れますが、JDK 1.6.0.23 を使用したMaven2.2.1 では次のコンパイル エラーが表示されます。

c は A で保護されたアクセスを持っています

4

4 に答える 4

3

@adranale からのコメントのおかげで、Access Controlの Java 言語仕様セクションで別の回答が見つかりました。このように動作するはずはないと思いますが、「保護された」読み取りに関する関連テキスト

保護されたメンバー m が宣言されているクラスを C とします。アクセスは、C のサブクラス S の本体内でのみ許可されます。

クラスの本体は、中括弧内のすべてのコードです。クラスの注釈は中かっこの外側にあるため、アクセスできません。興味深いことに、このロジックは、クラス本体内にあるメソッド、パラメーター、フィールド、またはローカル変数の注釈には適用されません。

于 2012-05-31T00:06:47.417 に答える
2

ここで何が起こっているのかわかります。注釈のインスタンスは、事実上、一意の静的初期化子とのインターフェースです。アノテーション仕様が上に追加するのは、構文糖衣とメソッド、クラス、またはフィールドへのリンクだけです。したがって、これを入力value=c.Aすると、注釈に静的イニシライザーを追加するのとほとんど同じです。注釈はAのサブクラスではないため、アクセスは拒否されます。保護されたアクセスにはパッケージアクセスが含まれるため、AをBと同じパッケージに移動すると、注釈もAと同じパッケージに含まれます。アクセスを取得します。非常に良い質問です。動作は両方のコンパイラで同じである必要があると思います。Eclipseを使用すると、エラーとして処理する内容をカスタマイズできるので、望ましくない、より制限的な動作の両方を使用することに同意させることができると思います。

于 2012-05-30T12:13:46.527 に答える
2

「const」で埋めようとしているアノテーションは、保護された機能を使用して外部からクラスにアクセスしようとします。Eclipse は独自のコンパイラを使用するため、Eclipse でクリーン リビルドを行って、動作するかどうかを確認する必要があります。私はそれがないと仮定します。

于 2012-05-30T10:18:44.857 に答える
1

Aこのコードは、 と が同じパッケージにB属している場合にのみコンパイルされます。

于 2012-05-30T10:30:46.460 に答える