2015-01-29 4 views
0

Я хочу передать значения в аннотацию. Пример:Значение передачи аннотаций

@Feature(someVaribleName) 

Если someVaribleName является final то все работает нормально. Так что это работает нормально:

private final String someVaribleName = "test"; 
@Feature(someVaribleName) 
public void testMethod() 
{ 
} 

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

Есть ли способы передать значение времени выполнения аннотациям в java?

ответ

0

Невозможно. В принципе, вы не можете передать переменную в аннотацию, потому что они обрабатываются во время компиляции. Однако библиотека аннотаций может реализовать подход замещающих элементов - например, вы передаете #{myVariable} в качестве значения, и во время выполнения библиотека аннотаций может выполнять задание, необходимое для принятия значения за заполнителем.

1

Единственный способ сделать это путем инъекции кода, например. используя Instrumentation.

Однако более простым решением является создание структуры с использованием отражения поддержки аннотации, например.

@Feature("someVaribleName") 

рамка будет получать переменную ваши указания someVaribleName от объекта.

Или вы могли бы вызвать метод

@Feature("getSomeName") 

и рамки должны были бы вызвать метод настроенную т.е. getSomeName

+0

Как сделать это в Instrumentation? – batman

1

Вы не можете сделать это непосредственно. Аннотации компилируются java-компилятором и записываются в байтовый код аннотированного класса.

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

interface Provider<T> { 
    T getValue(); 
} 

@interface FeatureProvider { 
    Class<? extends Provider> value(); 
} 

class SomeProviderImpl implements Provider<Integer> { 
    // the implementation can be as complicated as you want. 
    Integer getValue() { return 123; } 
} 

Теперь вот как вы можете использовать его:

@FeatureProvider(SomeProviderImpl.class) 
public void testMethod() {} 
+0

SomeProviderImpl.class дает мне значение? – batman

+0

Да, точно. Посмотрите также на ответ Питера. – AlexR

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