gpt4 book ai didi

java - 在注解中间接使用注解处理器生成的常量会导致编译错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:07:59 32 4
gpt4 key购买 nike

Get minimize code to reproduce this

我有一个HelloWorldProcessor,它只会生成源文件HelloWorldMessage.java

public interface HelloWorldMessage { 
String HELLO_WORLD = "Hello World";
}

现在我在我的代码中使用生成的值:

public class UseHelloWorld {
@Anno(HelloWorldMessage.HELLO_WORLD)
public void func(){
}
}

这很好。

但是如果我将这个值声明为常量并间接使用它,就会导致编译错误。

public class UseHelloWorld{
public static final String HW = HelloWorldMessage.HELLO_WORLD;

@Anno(UseHelloWorld.HW)
public void func(){
}
}

Javac 给出 symbol not found 错误:

UseHelloWorld.java:2: error: cannot find symbol
public static final String HW = HelloWorldMessage.HELLO_WORLD;
^
symbol: variable HelloWorldMessage
location: class UseHelloWorld
UseHelloWorld.java:4: error: element value must be a constant expression
@Anno(UseHelloWorld.HW)
^
2 errors

为什么我说“javac”是因为它在 eclipse 中与 ECJ 和 m2e-apt 一起工作得很好。

这是 javac 错误吗?如果不是,我如何才能更正间接使用生成的源?

最佳答案

我不知道这个主题,所以试着玩了一下。您的示例似乎不适用于 javac,按照您提供的步骤,我认为处理器未被调用。您可以尝试使用一些调试参数来验证它:

  1. -XprintProcessorInfo:打印有关要求处理器处理哪些注释的信息
  2. -XprintRounds:打印有关初始和后续注释处理轮次的信息。
  3. -verbose:详细输出。这包括有关每个加载的类和编译的每个源文件的信息。

其次,您似乎需要将处理器作为 jar 提供,其中包含 /META-INF/services/javax.annotation.processing.Processor。我试过这个,它更好但仍然失败,我认为这是因为源文件没有编译,所以编译器无法检索有关注释的任何信息。(我认为只需扫描源文件就可以)。

最后,我通过将注释的使用从 UseHelloWorld 移动到 package-info.java 文件(或任何其他可编译的文件)来使其工作。现在编译器可以看到注释已经在源文件中使用,处理器被调用生成HelloWorldMessage类,在下一轮编译。类 UseHelloWorld 也可以编译。

注意:我在您的文件中添加了一些importpackage,否则即使存在HelloWorldMessage 也无法编译类。

我认为它在 Eclipse 中起作用的原因是因为使用了不同的工具来进行处理。或者也许您已经生成源文件一段时间而忘记清理它。希望有人能给出更好的答案,我只是分享我的实验。


更新

我愚蠢地说我们应该以 jar 的形式提供处理器,显然一个类文件就足够了(我可能使用了错误的类路径)。我对更新后的帖子的猜测是编译器不会处理所有情况。在 Eclipse 中,我们看到关于 @Anno

的两个不同错误
  1. 使用 @Anno(HelloWorldMessage.HELLO_WORLD):HelloWorldMessage 无法解析为变量
  2. with @Anno(UseHelloWorld.HW): 注解属性Anno.value的值必须是常量表达式

也许在第一种情况下,编译器足够聪明,猜测注解处理器可以生成未知类型,所以它会尝试,而在第二种情况下,它会将其视为注解使用不正确。

关于java - 在注解中间接使用注解处理器生成的常量会导致编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51358016/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com