2

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

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

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

一种解决方法是生成如下内容:

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

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

4

2 回答 2

4

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

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

我了解您认为使用字符串限定名称而不是 Class 是不干净的,您是对的。事实上,你应该使用 TypeElement & TypeMirror ;-) 。

为什么你需要一个 Class 对象?我很确定你可以用 TypeElement 和 TypeMirror 做任何事情。

于 2011-09-12T07:35:10.907 回答
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) {
    }
}

它不会显式访问被注释类的类类型,但至少,它可以在代码中生成。

于 2011-09-11T16:29:56.983 回答