0

Я хотел написать код, который выглядит ниже.Как обработать аннотацию и установить значение по умолчанию при создании объекта

MyClass a = new @MyAnnotation MyClass() 

Пусть метод MyClass выглядеть ниже

public class MyClass { 

    int a; 

    public void setValue(int a) { 
     this.a = a; 
    } 

} 

Так что, когда кто-нибудь Creats объект MyClass с аннотацией, он должен установить значение по умолчанию для некоторых х (скажем 20).

В фреймворке он позволяет нам комментировать в коде, как показано ниже.

MyClass a = new @MyAnnotation MyClass() 

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

MyClass a = new MyClass(); 
    a.setValue(20); 

или если мы сможем пройти дефолтное значение, как показано ниже, также прекрасно.

MyClass a = new @MyAnnotation(value=20) MyClass() 

Может ли это быть достигнуто с помощью процессора аннотаций/необходимо использовать процессор байт-кода, такой как ASM, чтобы сделать это? Обновлен более значимым образом.

+0

Почему бы не создать конструктор? также ваш 'setValue (a)' возвращает тип 'Test', но в теле вы вернули' this'? – Kent

+0

Изменен для MyClass, это была опечатка. – Mahesh

+0

это не имеет смысла, это метод экземпляра и возвращает тот же экземпляр ... – Kent

ответ

1

Вы пишете пользовательскую систему типов с помощью мета-аннотаций? То есть, вы используете SubtypingChecker или создали ли вы свой собственный подтип BaseTypeChecker?

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

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

Варианта А: Полиморфные Конструкторы Шагов:

  1. Создания @PolyMyAnnotation полиморфной аннотации, см Polymorphic Qualifiers
  2. Создать полиморфный конструктор для MyClass, например @PolyMyAnnotation MyClass (@PolyMyAnnotation int a) {}
  3. Создайте TreeAnnotator, который добавляет @MyAnnotation к типу int литералов. См. Пример RegexTreeAnnotator.visitLiteral.
  4. Добавьте свой TreeAnotator в список TreeAnotator, используемый вашим AnnotatedTypeFactory. (См RegexAnnotatedTypeFactory

Вариант B: использовать TreeAnnotator шаги:

  1. Создать класс, который расширяет TreeAnnotator
  2. Override visitNewClass
  3. Определить, если объект строится является экземпляром MyClass (см. ElementUtils.getQualifiedClassName и ElementUtils.isObjectType, чтобы узнать, как это сделать).
  4. Если построенный класс является экземпляром MyCl ass, если да, посмотрите, является ли аргумент целым литералом.
  5. Если элемент является литералом, проанализируйте литерал и добавьте его значение в создаваемый тип. Обратите внимание, что если вы хотите, чтобы это обрабатывало нелитераторы, например. int a = 20; новый MyClass (a)

Затем вы можете использовать ValueChecker. Если ваш завод типа расширяет ValueAnnotatedTypeFactory, он будет поддерживать постоянное распространение. API потока данных также обеспечивает некоторую поддержку для постоянного распространения.

Вариант C: Настройка DataFlow в CFAbstractTransfer Функция Однако, если у вас есть пользовательские проверки, вы можете переопределить CFAbstractTransfer.visitMethodInvocation обнаружить, когда SetValue вызывается и уточнить его соответствующим образом. Вы можете посмотреть на примере RegexTransfer или найти методы, расширяющие CFAbstractTransfer или реализовать TransferFunction.

При этом поток данных не заменяет систему состояний типа (см. Обсуждение этого вопроса на Typestate checkers).

+0

Я новичок в аннотациях и пытаюсь выяснить, как это реализовать. Я уточнил вопрос более осмысленным способом. Можно ли это сделать, как указано вами, или использовать ASM? – Mahesh

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

  • Нет связанных вопросов^_^