Java 如何在代码生成的注释处理过程中检索注释的类类型?

Java 如何在代码生成的注释处理过程中检索注释的类类型?,java,class,reflection,annotation-processing,Java,Class,Reflection,Annotation Processing,注释处理器将为您提供两个,一个用于注释对象,另一个用于注释本身 假设在注释处理过程中需要知道注释对象的类类型才能生成代码。可以使用以下命令提取限定名称。但是,任何使用Class.forName(fullyQualifiedName)的尝试都会引发ClassNotFoundException 这可能意味着该类不在注释处理代码的路径上。是否有可能在注释处理期间检索这样一个类,而不必将所有注释代码放在处理库的类路径中 解决方法是生成以下内容: Class c = Class.forName("thef

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

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

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

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

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

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

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

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

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

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

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

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


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

我需要通过生成的代码在结构(即集合)中注册带注释的类类型。它必须是自动化的。因此,我需要在注释处理期间以某种方式检索/访问它。我正在尝试检索实现注释接口的类,为此目的,存在反射,但这需要类对象:
getsubscriptsof()
。我还没有找到另一种方法来查找子类型,或者在实现的接口中找到注释。