繁体   English   中英

如何在注释处理过程中获取带注释的类类型以生成代码?

[英]How to retrieve class type of annotated during annotation processing for code generation?

注释处理器将为您提供两个TypeElement ,一个用于带注释的对象,一个用于注释本身。

假设需要在注释处理以生成代码的过程中了解被注释对象的Class类型。 可以使用TypeElement.getQualifiedName()提取限定名称。 但是,任何使用Class.forName(fullyQualifiedName)尝试Class.forName(fullyQualifiedName)抛出ClassNotFoundException

这可能意味着该类不在注释处理代码的路径上。 是否有可能在注释处理过程中检索此类,而不必将所有带注释的代码放入处理库的类路径中?

解决方法是生成类似以下内容的内容:

Class c = Class.forName("thefullyqualifiedname");

并在生成的代码中使用c,但这并不干净。

注释处理发生时,带注释的类的“类”对象不可用似乎很正常,因为它发生在编译时。 这就是为什么TypeElements和TypeMirrors在那里的原因,它们与Class对象严格相等。

正如您指出的那样,注释只能访问其类路径上的类对象。 注释类不是这种情况,因为它正在被编译。

我知道您认为使用字符串限定名称而不是Class是不干净的,并且您是对的。 实际上,您应该使用TypeElement&TypeMirror ;-)。

由于什么原因,您需要Class对象? 我很确定您可以使用TypeElement和TypeMirror做任何事情。

我能想到的最好的解决方法是:

    JClass annotatedType = jcmSource.ref(Class.class);

    JInvocation m =  annotatedType.staticInvoke("forName");
    m.arg(fa.getAnnotated().toString());

    JFieldVar field = sourceClass.field(
            JMod.PRIVATE | JMod.STATIC, annotatedType, "c");

    JBlock staticInit = sourceClass.init();

    JTryBlock tb = staticInit._try();
    JBlock jbtb = tb.body();
        jbtb.assign(field, m);
    tb._catch(jcmSource.ref(ClassNotFoundException.class));

产生:

private static Class c;

static {
    try {
        c = Class.forName("net.codegentest.CodeGenTest");
    } catch (ClassNotFoundException _x) {
    }
}

它没有显式访问带注释的类的类类型,但是至少可以在代码中生成它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM