【问题标题】:How to retrieve class type of annotated during annotation processing for code generation?如何在代码生成的注释处理期间检索注释的类类型?
【发布时间】:2011-11-14 17:40:58
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java class reflection annotation-processing


    【解决方案1】:

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

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

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

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

    【讨论】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多