当前位置: 首页 > 知识库问答 >
问题:

如何在注解处理中获取超级类名

阎伟志
2023-03-14

我运行自己编写的注释处理器,根据注释类生成一些新的java代码。下面是我试图获取当前处理的类的超级类名的内容。

TypeMirror superTypeMirror = typeElement.getSuperclass();
final TypeKind superClassName = superTypeMirror.getKind();
log("A==================" + superClassName.getClass());
log("B==================" + superClassName.getDeclaringClass());

typeElement返回注释处理器正在处理的当前类。我想知道这个扩展了哪些类,哪些类是由这个类实现的。我使用的方法一点帮助都没有。

感恩节

共有2个答案

祁承嗣
2023-03-14

可以通过反射找到任何Java对象的超类。这里解释http://da2i.univ-lille1.fr/doc/tutorial-java/reflect/class/getSuperclass.html

关于实现类。这更难,因为我相信一个给定的类永远不会“知道”哪些类扩展了它。你需要建立一个复杂的继承树来获得完整的画面。

法浩壤
2023-03-14

如果我正确理解了这个问题,输入。directSupertypes()是您需要的方法。

它将首先返回直接超类的类型,然后返回(直接)实现的接口(如果有)。

不管它们是表示超类还是超接口,您都应该能够将它们转换为DeclaredType,它有一个asElement()方法,可以用来查询简单且完全限定的名称。

所以你会有这样的东西:

for (TypeMirror supertype : Types.directSupertypes(typeElement)) {
   DeclaredType declared = (DeclaredType)supertype; //you should of course check this is possible first
   Element supertypeElement = declared.asElement();
   System.out.println( "Supertype name: " + superTypeElement.getSimpleName() );
}

如果typeElementTypeMirror,则上述操作有效。如果是typeElement,则只需调用typeElement即可直接获得超类和超接口。getSuperclass()类型元素。getInterfaces()单独(而不是类型。directSupertypes())但过程的其余部分是相同的。

 类似资料:
  • 问题内容: 我正在编写我的第一个注释处理器,但遇到一些琐碎的问题,但找不到任何有关它的信息。 我有一个带有注释的元素 当我将此属性作为处理器中的元素获取时,我似乎无法以任何方式获取元素的类型。在这种情况下,可能要获取代表String的Class或TypeElement实例。 我尝试使用实例化容器类型的类对象,但它引发了ClassNotFoundException。我认为这是因为我无法访问包含该类的

  • 问题内容: 我创建了自己的注释类型,如下所示: 并将其附加到一个类上: 我试图通过反射来获得类注释,如下所示: 但它没有打印任何内容。我究竟做错了什么? 问题答案: 默认的保留策略是,默认情况下,注释信息在运行时不保留: 批注由编译器记录在类文件中,但VM在运行时无需保留。这是默认行为。 而是使用: 注释将由编译器记录在类文件中,并在运行时由VM保留,因此可以通过反射方式读取它们。 …您使用met

  • 问题内容: 我有一个名为@Pojo的自定义注释,可用于自动生成Wiki文档: 我这样使用它: 注释资源方法,以便注释处理器可以自动生成描述所需资源和类型的Wiki页面。 我需要在注释处理器中读取该字段的值,但出现运行时错误。 在我的处理器的源代码中,我有以下几行: 但实际的类不适用于处理器。我认为我需要一个替代品来代替实际课程。我不确定该怎么买。 我得到的错误是: 该是我的一个提到的一类注释。 不

  • 我正在编写一个在javac中运行的注释处理器。它扫描带注释的类并生成包含类名的资源文件。这些名称将在运行时使用,以便能够获得

  • 考虑下面的代码: 使用用于注释处理的最新JDK8 API,如何访问注释列表(@JSON,@freezed) 我尝试过很多技巧,比如