2011-09-11 34 views
2

注释处理器将为您提供两个TypeElement,一个用于注释对象,另一个用于注释本身。如何在代码生成的注释处理中检索注释的类类型?

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

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

一种解决方法是产生这样的:

Class c = Class.forName("thefullyqualifiedname"); 
中,而不是生成的代码

和使用C,但它是不干净。

回答

0

我能拿出最好的解决方法是:

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

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

4

注解处理发生时,注释类的“Class”对象不可用,因为它发生在编译时。这就是为什么TypeElements和TypeMirrors在那里,它们是Class对象的严格等价物。

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

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

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

+0

我需要通过生成的代码在结构(即一组)中注册注释的类类型。它必须是自动的。因此,我需要在注释处理过程中以某种方式检索/访问它。 – JVerstry

+0

我想要检索实现注释接口的类,为此目的使用Theres反射,但是这需要Class对象:'getSubTypesOf()'。我还没有找到另一种查找子类型的方法,或者可以在实现的界面中找到注释。 –