![](/img/trans.png)
[英]How to set default value to annotation variable as the class type of the variable annotated?
[英]How to retrieve class type of annotated during annotation processing for code generation?
注释处理器将为您提供两个TypeElement ,一个用于带注释的对象,一个用于注释本身。
假设需要在注释处理以生成代码的过程中了解被注释对象的Class
类型。 可以使用TypeElement.getQualifiedName()提取限定名称。 但是,任何使用Class.forName(fullyQualifiedName)
尝试Class.forName(fullyQualifiedName)
抛出ClassNotFoundException
。
这可能意味着该类不在注释处理代码的路径上。 是否有可能在注释处理过程中检索此类,而不必将所有带注释的代码放入处理库的类路径中?
解决方法是生成类似以下内容的内容:
Class c = Class.forName("thefullyqualifiedname");
并在生成的代码中使用c,但这并不干净。
注释处理发生时,带注释的类的“类”对象不可用似乎很正常,因为它发生在编译时。 这就是为什么TypeElements和TypeMirrors在那里的原因,它们与Class对象严格相等。
正如您指出的那样,注释只能访问其类路径上的类对象。 注释类不是这种情况,因为它正在被编译。
我知道您认为使用字符串限定名称而不是Class是不干净的,并且您是对的。 实际上,您应该使用TypeElement&TypeMirror ;-)。
由于什么原因,您需要Class对象? 我很确定您可以使用TypeElement和TypeMirror做任何事情。
我能想到的最好的解决方法是:
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) {
}
}
它没有显式访问带注释的类的类类型,但是至少可以在代码中生成它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.