Вопрос по java – Java-аннотация не может получить доступ к защищенным статическим полям из высшего класса

4

Этот код действителен?

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

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

}

Eclipse с JDK 1.6.0.23 принимает это, ноMaven 2.2.1 с JDK 1.6.0.23 показывает мне следующую ошибку компиляции:

c has protected access in A

Ваш Ответ

4   ответа
3

икация языка Java» наКонтроль доступа, Я не думаю, что это должно работать таким образом, но соответствующий текст, касающийся "защищен" читает

Пусть C будет классом, в котором объявлен защищенный член m. Доступ разрешен только внутри тела подкласса S из C.

Тело класса - это весь код в фигурных скобках. Аннотации классов находятся вне фигурных скобок, поэтому они не имеют доступа. Интересно, что эта логика не будет применяться к методу, параметру, полю или аннотации локальной переменной, которые находятся внутри тела класса.

2

const & quot; пытается получить доступ к классу извне, используя защищенный, который не может работать. Eclipse использует собственный компилятор, поэтому вам следует попытаться произвести чистую перестройку в Eclipse, чтобы проверить, работает ли он. Я предполагаю, что не будет.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded adranale
2

что я вижу, что здесь происходит. Экземпляр аннотации фактически является интерфейсом с уникальным статическим инициализатором. Единственное, что добавляет спецификация аннотации - это синтаксический сахар и ссылка на метод, класс или поле. Поэтому, когда вы печатаетеvalue=c.A это почти как добавление статического инициатора в аннотацию. Аннотация не является подклассом A, поэтому доступ запрещен. Защищенный доступ включает в себя доступ к пакету, поэтому, когда вы перемещаете A в тот же пакет, что и B, аннотация также находится в том же пакете, что и A. Он получает доступ. Очень хороший вопрос, и я думаю, что поведение должно быть одинаковым для обоих компиляторов. , что Eclipse позволит вам настроить то, что он рассматривает как ошибку, чтобы вы могли заставить их согласиться использовать нежелательное, более ограничительное поведение.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

A а такжеB принадлежат к той же упаковке.

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededA.cError: User Rate Limit ExceededB? adranale
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded adranale

Похожие вопросы