将值传递给注释

时间:2015-01-29 10:40:30

标签: java

我想将值传递给注释。例如:

@Feature(someVaribleName)

如果someVaribleNamefinal,那么事情就可以了。所以这很好用:

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

但我希望传递其他信息,我将仅在运行时了解,因此无法更改someVaribleName

有没有办法将运行时值传递给java中的注释?

3 个答案:

答案 0 :(得分:1)

执行此操作的唯一方法是通过代码注入,例如使用Instrumentation

然而,更简单的解决方案是让框架使用Annotation支持反射,例如

@Feature("someVaribleName")

框架将从对象中获取指定someVaribleName的变量。

或者你可以调用方法

@Feature("getSomeName")

并且框架需要调用您配置的方法,即getSomeName

答案 1 :(得分: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() {}

答案 2 :(得分:0)

这是不可能的。基本上,您无法将变量传递给注释,因为它们是在编译期间处理的。但是,注释库可以实现占位符方法 - 例如,您将#{myVariable}作为值传递,并且在运行时,注释库可以执行占位符后面的值所需的工作。