Аннотации Javassist MemberValue без имени

Я добавлял аннотации к методу с помощью javassist. Единственная аннотация, которую я не смог добавить, была:

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)

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

Вот как я добавлял аннотации до сих пор:

a = new Annotation("WebResult",  cpp);
a.addMemberValue("targetNamespace", new StringMemberValue("value", cpp));
attr.addAnnotation(a);

Проблема в том, что a.addMemberValue("TransactionAttributeType.NOT_SUPPORTED"); не компилируется из-за неправильного синтаксиса:

Метод addMemberValue(Annotation.Pair) в типе Annotation неприменим для аргументов (String)

Я знаю, что должно быть значение, но эта аннотация не имеет значения.


person stef    schedule 10.03.2017    source источник
comment
Можете ли вы опубликовать ошибку, которую вы получаете?   -  person rakwaht    schedule 10.03.2017
comment
Допустим, я хочу добавить следующую аннотацию: a.addMemberValue(TransactionAttributeType.NOT_SUPPORTED); -it подчеркивает addMemberValue, поскольку синтаксис неверен. Метод addMemberValue(Annotation.Pair) в типе Annotation неприменим для аргументов (String). Я знаю, что должно быть значение, но моя аннотация не имеет значения: @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)   -  person stef    schedule 10.03.2017


Ответы (1)


Я не пробовал это решение, однако, просматривая Интернет, единственное, что я нашел по этой теме, было решение, предложенное на форуме разработчиков JBoss, которое вы можете найти здесь.

В соответствии с этим решением они узнали, распечатав аннотации из обычного класса, что значение — это имя, которое нужно использовать.

Поэтому я предлагаю вам попробовать это решение, а затем опубликовать здесь в этом ответе, если это сработало для вас.

a = new Annotation("WebResult",  cpp);
a.addMemberValue("value", new StringMemberValue("TransactionAttributeType.NOT_SUPPORTED", cpp));
attr.addAnnotation(a);

PS: я также предлагаю указать полное имя атрибута, просто чтобы убедиться, что компилятор времени выполнения правильно его понимает (например, com.my.package.TransactionAttributeType.NOT_SUPPORTED)

РЕДАКТИРОВАТЬ

Как мы заметили, предлагаемое решение заключается в добавлении свойства в аннотацию в виде строки new StringMemberValue("..."), ведущей к такому результату:

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTE‌​D)

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

Например, если вашим параметром является класс Java, вы должны сделать что-то вроде этого:

a.addMemberValue("value", 
      new ClassMemberValue("com.package.classname", cpp));

Или, если ваш член является перечислением, вы можете добавить его в свою аннотацию примерно так:

  EnumMemberValue emv = new EnumMemberValue(cpp);
  emv.setType("TransactionAttributeType");
  emv.setValue("NOT_SUPPORTED");
  a.addMemberValue("value", emv);
person rakwaht    schedule 10.03.2017
comment
Ваш ответ действительно приближает меня на шаг к окончательному решению, но еще не все. После компиляции он вводит его как @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED), а моя нотация должна выглядеть точно так же, как этот @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED), без кавычек. - person stef; 10.03.2017
comment
Что такое TransactionAttributeType.NOT_SUPPORTED? Перечисление класса или что? - person rakwaht; 10.03.2017
comment
Не уверен на самом деле, я просто знаю, что это должно быть там. Это единственное, что я смог найти на нем: ссылка - person stef; 10.03.2017
comment
В вашей ссылке написано, что это enum. В любом случае попробуйте мои новые решения и дайте мне знать - person rakwaht; 10.03.2017
comment
Вы правы, это перечисление, ваше решение работает. Каждый день я узнаю что-то новое, благодаря таким людям, как вы. Большое спасибо за ваше время и вашу помощь! - person stef; 10.03.2017