Удалить аннотации в подклассе? - PullRequest
3 голосов
/ 24 июня 2011

У меня есть дочерний класс, который нуждается в аннотации, объявленной в удаленном родительском классе.Каков наилучший способ сделать это?

public class Parent

@MyAnnoation
String foobar;

}


public class Child extends Parent {
//here I only want to remove the @MyAnnotation from String foobar;

}

Чего я хочу избежать, так это "переопределения" члена

 public class Child extends Parent {

 String foobar;

 }

, поскольку это имеет несколько недостатков (поскольку оно "покрывает")нижележащий родительский элемент = this.foobar может отличаться от super.foobar) ...

1.) Существует ли простой способ удаления аннотации из родительского класса в подклассе (здесь дочерний)?

2.) Какой официальный способ удаления аннотаций в подклассе?

Большое спасибо!Markus

Ответы [ 2 ]

4 голосов
/ 24 июня 2011

Если вы хотите сделать что-то подобное, вы, вероятно, должны по-другому взглянуть на свой дизайн.

Я думаю, что если есть способ удалить аннотацию времени выполнения, то это не рекомендуется, потому что вы удалили бы часть определения класса.Как, например, удаление модификатора доступа к члену.

Это может привести к неожиданным результатам в вашей логике, поскольку другой код может полагаться на эти определения для принятия решений во время выполнения.

Если вам нужно изменить определение классаво время выполнения, чем этот класс, вероятно, не следует определять таким образом, во-первых.

1 голос
/ 20 июля 2016

Насколько мне известно, вы не можете удалить аннотации.Но это может помочь:

  1. Не все аннотации доступны во время выполнения.Таким образом, в этом случае, очевидно, нет причин их удалять.Только аннотации с @Retention(RUNTIME) доступны во время выполнения.(например, @Nullable аннотации недоступны во время выполнения, но @XmlElement есть.).

  2. Только для аннотаций на уровне класса , есть еще одна вещь, которую нужно принятьв аккаунте.Не все аннотации автоматически наследуются дочерним классам.Это относится только к аннотациям, которые имеют собственную аннотацию @Inherited.

  3. Некоторым аннотациям можно противопоставить повторное выделение другой аннотации.(например, родительский класс с @XmlAccessorType(FIELD) может иметь дочерний класс с @XmlAccessorType(PUBLIC).)

Таким образом, удаление невозможно, но переопределение / замена есть. На практике это означает, что эффект некоторых аннотаций можно «удалить», установив для них значение по умолчанию @MyAnnotation(NONE) или @MyAnnotation(DEFAULT) или @NotMyAnnotation. Таким образом, это означает, что это действительно зависит от того, какого родааннотации, с которыми вы имеете дело.

Еще одна вещь: даже если вы можете переопределить аннотации на дочерних классах, тем не менее, это не всегда дает желаемый эффект.(Например, в случае @XmlElement иногда аннотация родительского метода по-прежнему имеет приоритет во время выполнения).Полезно знать, что некоторые фреймворки (например, постоянство) поддерживают альтернативные файлы связывания XML в качестве альтернативы аннотациям java-класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...