我想将值传递给注释。例如:
@Feature(someVaribleName)
如果someVaribleName
是final
,那么事情就可以了。所以这很好用:
private final String someVaribleName = "test";
@Feature(someVaribleName)
public void testMethod()
{
}
但我希望传递其他信息,我将仅在运行时了解,因此无法更改someVaribleName
。
有没有办法将运行时值传递给java中的注释?
答案 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}
作为值传递,并且在运行时,注释库可以执行占位符后面的值所需的工作。