首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在代码生成的批注处理过程中检索批注的类类型?

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

Stack Overflow用户
提问于 2011-09-11 20:03:55
回答 2查看 1.8K关注 0票数 2

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

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

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

解决方法是生成类似于以下内容的内容:

代码语言:javascript
运行
复制
Class c = Class.forName("thefullyqualifiedname");

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-12 00:29:57

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

代码语言:javascript
运行
复制
    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));

这会产生:

代码语言:javascript
运行
复制
private static Class c;

static {
    try {
        c = Class.forName("net.codegentest.CodeGenTest");
    } catch (ClassNotFoundException _x) {
    }
}

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

票数 1
EN

Stack Overflow用户

发布于 2011-09-12 15:35:11

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

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

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7378049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档