如何在代码生成的注释处理期间检索带注释的类类型?

时间:2011-09-11 12:03:55

标签: java class reflection annotation-processing

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

假设在注释处理期间需要知道注释对象的Class类型以生成代码。可以使用TypeElement.getQualifiedName()提取限定名称。但是,任何使用Class.forName(fullyQualifiedName)的尝试都会引发ClassNotFoundException

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

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

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

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

2 个答案:

答案 0 :(得分:4)

在注释处理发生时,带注释的类的“Class”对象似乎很正常,因为它发生在编译时。这就是TypeElements和TypeMirrors存在的原因,它们是Class对象的严格等价物。

正如您所指出的,注释只能访问其类路径中的类对象。并且它不是带注释的类的情况,因为它正在被编译。

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

你为什么需要Class对象?我很确定你可以用TypeElement& TypeMirror的。

答案 1 :(得分:1)

我能想出的最佳解决方法如下:

    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) {
    }
}

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