2016-06-10 4 views
3

Я использую Spring для создания ModelMap, который визуализируется, а затем анализируется Усы. По этой причине у меня есть несколько классов, которые существуют только для переноса данных для удобства Усачей.Могу ли я агрегировать, прокси или подражать @SuppressWarnings в Java?

Эти классы имеют поля и методы, которые никогда не используются в коде, но фактически используются Spring (и, в свою очередь, Mustache). Я хочу прямо заявить, что это намеренное по аннотирования класса с аннотациями @ForMustache который выглядит следующим образом:

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.SOURCE) 
public @interface ForMustache { 
} 

Моей цель состоит в основном причудливый способ сказать @SuppressWarnings("unused") // For Mustache.

Я попытался аннотировать ForMustache с помощью @SuppressWarnings("unused"), но его эффекты применяются в моей аннотации вместо того, чтобы распространяться на тип, аннотированный @ForMustache.

Могу ли я проксировать или подражать @SuppressWarnings("unused") с другой аннотацией?

+1

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

+0

[Этот вопрос] (http://stackoverflow.com/questions/33345605/java-custom-annotation-aggregate-multiple-annotations) очень тесно связан с тем, что вы пытаетесь сделать (вы просто пытаетесь создать мета-аннотация, которая содержит только одну аннотацию, а не несколько). Это может быть даже дубликат этого вопроса. – JonK

+0

@zapl Спасибо за подсказку, я постараюсь расследовать! –

ответ

2

Аннотации @SuppressWarnings предназначены для компилятора и других инструментов времени компиляции, которые работают непосредственно с исходными файлами.

Он также указан как

@Retention(RetentionPolicy.SOURCE) 
public @interface SuppressWarnings { ... 

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

Учитывая достаточное время, вы можете создать обработчик аннотации, который во время компиляции преобразует аннотацию @ForMustache в @SuppressWarnings, чтобы компилятор мог ее поднять. Аналогичным образом Lombok может превратить

@Data 
class Foo { 
    private final String value; 
} 

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

Кроме того, чтобы повесить @SuppressWarnings, ваш единственный шанс удалить условие, вызывающее предупреждение.

  • Отключение проверки с опцией компилятора
  • общедоступных добытчиков или другой код, используются поля (с Ломбками, например)
  • крючка в процесс компиляции.
+0

Отличный ответ!Я действительно рассматривал возможность написания обработчика аннотаций, но, похоже, это слишком много усилий для достижения этой цели. Большое спасибо за ваши предложения! –

Смежные вопросы