批注处理器将为您提供两个TypeElement,一个用于批注对象,另一个用于批注本身。
让我们假设在批注处理期间需要知道带批注的对象的Class类型才能生成代码。可以使用TypeElement.getQualifiedName()提取限定名称。但是,任何使用Class.forName(fullyQualifiedName)的尝试都会抛出ClassNotFoundException。
这可能意味着类不在批注处理代码的路径上。有没有可能在批注处理期间检索这样的类,而不必将所有带批注的代码放在处理库的类路径中?
解决方法是生成类似于以下内容的内容:
Class c = Class.forName("thefullyqualifiedname");并在生成的代码中使用c,但它并不干净。
发布于 2011-09-12 00:29:57
我能想到的最好的解决方法是:
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-12 15:35:11
带注释的类的" class“对象在注释处理发生时不可用,这似乎很正常,因为它发生在编译时。这就是TypeElements和TypeMirrors存在的原因,它们是类对象的严格等价物。
正如您所指出的,注释只能访问其类路径上的类对象。这不是带注释的类的情况,因为它是在编译的。
我知道您认为使用字符串限定名而不是Class是不干净的,您是对的。实际上,您应该使用TypeElement & TypeMirror ;-)。
你为什么需要一个Class对象呢?我确信你可以用TypeElement & TypeMirror做任何事情。
https://stackoverflow.com/questions/7378049
复制相似问题