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

注释处理器:如何知道Kotlin类是否标记有元素的“内部”可见性修饰符

祁承望
2023-03-14

我正在使用Auto Service处理一些注释,但是我无法识别Kotlin类是否具有来自注释处理器API的“内部”可见性修饰符。

我在处理器中使用 KAPT 和 Kotlin。依赖:

    implementation group: 'org.jetbrains.kotlin', name: 'kotlin-reflect', version: "1.3.0-rc-190"
    implementation files("${System.properties['java.home']}/../lib/tools.jar")
    implementation 'com.squareup:kotlinpoet:1.0.0-RC2'
    implementation "com.google.auto.service:auto-service:1.0-rc4"
    kapt "com.google.auto.service:auto-service:1.0-rc4"

样本类别:

@MyAnnotation
internal class Car

我在process方法中得到了这个类型元素

override fun process(annotations: MutableSet<out TypeElement>, roundEnv: RoundEnvironment): Boolean {
        roundEnv.getElementsAnnotatedWith(MyAnnotation::class.java).forEach { classElement ->
            if (classElement.kind != ElementKind.CLASS) {
                error(...)
                return true
            }
            classElement as TypeElement

但是我不知道如何检测类是否有“内部”修饰符。

关于如何检测“内部”修饰符的任何想法?

共有1个答案

花烨
2023-03-14

当您的静态编程语言代码转换为. class形式时,没有内部修饰符。但是当您反编译静态编程语言代码. class文件时,您会看到有一个@Metadata注释。

此元数据注释以二进制形式提供有关Kotlin声明的一些信息。您可以使用Kotlinx元数据读取和修改<code>的元数据。类文件。

因此,您需要从 classElement 中获取@Metadata注释,然后使用 kotlinx 元数据中的标志来找出它是否有内部修饰符:

例如:

override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? {
    if (Flag.IS_INTERNAL(flags)) {
        println("function $name is internal")
    }
    ...
} 
 类似资料:
  • 我无法理解内部访问修饰符。在我的例子中,我无法产生任何与公共行为不同的情况。即使我创建了一个jar,我也可以从jar外部访问jar中的内部函数(来自与jar中使用的包无关的不同包)。在文档中使用了术语模块,但我无法找到模块的确切含义。 因此,我的问题是: > kotlin中的模块是什么? 内部访问修饰符与公共修饰符有何不同?

  • 我正在使用KotlinPoet和Auto Service自动生成代码。我没有找到任何方法来知道带注释的类是否具有“内部”修饰符,因此我可以使用相同的修饰符创建另一个类。例如: 所以我想使用静态编程语言反射我将能够得到这些信息,但没有运气。 关于如何做到这一点的任何线索?

  • 假设您正在编写一个Android项目(不是库)。所有文件都编译在一起,因此......在这种情况下使用可见性修饰符有任何意义吗?

  • private private修饰符是我们使用的最限制的修饰符。它表示它只能被自己所在的文件可见。所以如果我们给一个类声明为private,我们就不能在定义这个类之外的文件中使用它。 另一方面,如果我们在一个类里面使用了private修饰符,那访问权限就被限制在这个类里面了。甚至是继承这个类的子类也不能使用它。 所以一等公民,类、对象、接口……(也就是包成员)如果被定义为private,那么它们只

  • Kotlin中这些修饰符是与我们Java中的使用是有些不同的。在这个语言中默认的修饰符是public,这节约了很多的时间和字符。但是这里有一个详细的解释关于在Kotlin中不同的可见性修饰符是怎么工作的。

  • 所有构造函数默认都是public的,它们类是可见的,可以被其它地方使用。我们也可以使用这个语法来把构造函数修改为private: class C private constructor(a: Int) { ... }