【发布时间】:2020-09-02 08:29:07
【问题描述】:
看来我的误解导致我提出这个问题。请帮我整理一下。 JLS 9.6.1 声明“类或类的调用(第 4.5 节)”作为注释类型被涵盖,chrylis -cautiouslyoptimistic 指出。
我们都同意静态导入是一个常量(好吧,假装我没有说那句话:这当然不是真的https://stackoverflow.com/a/9083023/1236128)
import static path.to.someFunction
我创建一个这样的注释
@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.METHOD, ElementType.FIELD})
public @interface Testing {
Class<? extends Function> symbol();
}
给定一个静态函数(即使声明这个 final 也不会使 someFunction 在 Java 中定义为常量,这让我很失望):
public static Function<Long, Long> someFunction = a -> b;
对不起(我意识到函数本身和它的应用程序是有区别的),
public static Function<Long, Long> someFunction = a -> 2L;
我创建一个这样的单元测试(假设前面提到的静态导入):
@Test
@Testing(symbol = someFunction)
void someFunctionTest() {
....
}
除了我的错误之外,有人知道这在编译时会有多大用处吗?我可以对标有 @Tested 的所有函数使用反射,以查看某处是否确实有针对它的测试(基于 @Testing 注释)。
有趣的是,我为注释提供了一个常量,但这是 IntelliJ 给出的抱怨:
属性值必须是 [a] 常量。
那是怎么回事?注释机制是在尝试执行函数,还是将其作为高阶函数接受?
【问题讨论】:
-
我不同意静态导入是常量。
-
注意:如果您真的想要,您可以将其定义为
String,在其中定义 lambda 的内容,然后将String编译为函数实例处理注释时的运行时...... Spring的SpEL(除其他外)像这样工作。
标签: java annotations