2016-12-05 3 views
0

То, что я знаю, являются:Как понять аннотацию в java И как реализовать мою аннотацию в java?

  • аннотаций была добавлена ​​в Java 5
  • аннотаций можно использовать в метод, класс и свойство
  • аннотаций может работать в RUNTIME, CLASS, ИСТОЧНИК (я не» t знать, как работать с CLASS и SOURCE и их функциями)
  • аннотация с сохранением, которая RUNTIME может быть реализована при запуске java-программы.

И я хочу, чтобы реализовать аннотацию иметь следующие характеристики:

  • обеспечения класса только разрешают создать экземпляр
  • обеспечивают методы только быть разрешен доступ метод в классе
  • это похоже на друга в C++
  • он такой же, как открытый и закрытый, но более динамичный, как

    @MyAnnotation (allowMethods = {xxx.doSomething})
    общественного недействительными GetValue() {}

    метод GetValues ​​только могут быть доступны в экземпляре себя и xxx.doSomething метод()

Что мне делать и учиться в следующем?

И где я могу узнать об этом?

+0

Я не совсем понимаю две функции, которые вы хотите реализовать, но это очень похоже на то, что это можно сделать с помощью модификаторов доступа ('private' vs' public'). – Thilo

+0

@Thilo Если я правильно понимаю OP, это звучит как противоположность модификаторам доступа. «обеспечить доступ к методам, доступным только методу в классе», звучит так, как метод должен разрешаться только вызывать методы того же класса (== no «внешние классы») ... может быть так? Пожалуйста, исправьте меня, если я ошибусь. – Fildor

+0

@Fildor У меня есть вопрос об обновлении, вы можете это понять? если нет, пожалуйста @ me –

ответ

1

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

Тем не менее, аннотация, в которой применяется политика (как и ваша), может быть реализована либо при компиляции, либо во время выполнения, но для этого вам необходим внешний механизм. Я могу думать о 3:

  1. Annotation processing позволяет взаимодействовать с компилятором и процесса аннотаций путем генерации кода или опуская ошибок компилятора. К сожалению, я не думаю, что это сработает для вашего случая, так как вы хотите защитить аннотированный тип от создания экземпляра, а это значит, что на сайте вызова нет аннотации. Обработка аннотаций дает вам доступ к фактическим фрагментам кода, которые содержат аннотации, а не к тем, которые относятся к ним.
  2. AspectJ позволяет писать аспекты обеспечения соблюдения правил и опускать ошибки компилятора на основе статических pointcuts. Проблема заключается в том, что статические pointcuts имеют очень ограниченную семантику, поэтому, хотя вы можете запретить создание экземпляра вашего класса в целом или из определенных пакетов, вы не можете ограничить экземпляры ваших классов до 1.
  3. Третий способ и, возможно, только разумный способ заключается в том, что вы используете контейнер типа Spring или Guice и настраиваете свой класс как singleton. Пока вы только извлекаете свой класс из контейнера, он никогда не создаст второй экземпляр.

Наконец: Если вы хотите ограничить количество экземпляров вашего класса, вы всегда можете использовать классический Singleton pattern approach.