在java注释类中添加我的静态变量

问题描述 投票:0回答:1

我如何将静态变量添加到类中,就像

Log4j2
中那样?

例如:

import lombok.extern.log4j.Log4j2;

@Log4j2
public class TestClass {
    public void test() {
        log.info("test");
    }
}

生成的源类如下所示:

public class TestClass {
    @Generated
    private static final Logger log = LogManager.getLogger(TestClass.class);
    
    public void test() {
        log.info("test");
    }
}

我创建了扩展

javax.annotation.processing.AbstractProcessor
的类,并尝试通过添加一些静态字符串来修改原始类,但我不知道如何正确执行:/

@SupportedAnnotationTypes("TestAnnotation")
@SupportedSourceVersion(SourceVersion.RELEASE_17)
public class TestProcessor extends AbstractProcessor {

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        for (Element element : roundEnv.getElementsAnnotatedWith(TestAnnotation.class)) {
            if (element.getKind().isClass()) {
                // ???
            }
        }
        return true;
    }
}

我想要类似的东西:

@TestAnnotation
public class TestClass {
    public void test() {
        System.out.println(testString); // testString is inserted by TestProcessor 
    }
}
java reflection
1个回答
0
投票

不幸的是,Java 注解处理不能用于修改现有代码,只能生成新代码。您引用的

Log4j2
注释属于Lombok,它是一种与注释处理器不同的野兽

这取决于您具体需要什么,但一般来说,您可以:

  • 使用像 ByteBuddy 这样的字节码生成器在运行时生成代码(简而言之,扩展你的
    TestClass
    并使用自定义行为覆盖有问题的方法)
  • 使用 AspectJ 在构建时修改代码(例如,以这种方式声明一个新字段)

我确信还有其他选项,但正如我所说,这些选项取决于您的特定用例。

© www.soinside.com 2019 - 2024. All rights reserved.