Kotlin反射:如何知道Kotlin类是否标有;“内部”;可见性修改器
我正在使用KotlinPoet和自动服务自动生成代码。我没有找到任何方法来知道一个带注释的类是否有“内部”修饰符,这样我就可以用相同的修饰符创建另一个类。例如:Kotlin反射:如何知道Kotlin类是否标有;“内部”;可见性修改器,kotlin,kotlin-reflect,kotlinpoet,Kotlin,Kotlin Reflect,Kotlinpoet,我正在使用KotlinPoet和自动服务自动生成代码。我没有找到任何方法来知道一个带注释的类是否有“内部”修饰符,这样我就可以用相同的修饰符创建另一个类。例如: @MyAnnotation internal class Car 所以我认为使用Kotlin反射可以得到这些信息,但运气不好 使用注释器处理器,我可以获得KClass,但可见性显示为“public”: 有没有关于如何做的线索?Kotlin的KClass具有visibility属性,可以是KVisibility。INTERNALKot
@MyAnnotation
internal class Car
所以我认为使用Kotlin反射可以得到这些信息,但运气不好
使用注释器处理器,我可以获得KClass,但可见性显示为“public”:
有没有关于如何做的线索?Kotlin的
KClass
具有visibility
属性,可以是KVisibility。INTERNAL
Kotlin的KClass
具有visibility
属性,可以是KVisibility。INTERNAL
因为INTERNAL
是,您应该在KClass
API中查找相关内容。以下内容将帮助您:
/**
* Visibility of this class, or `null` if its visibility cannot be represented in Kotlin.
*/
@SinceKotlin("1.1")
public val visibility: KVisibility?
这样使用:
Car::class.visibility//INTERNAL
由于INTERNAL
是一个函数,您应该在KClass
API中查找相关内容。以下内容将帮助您:
/**
* Visibility of this class, or `null` if its visibility cannot be represented in Kotlin.
*/
@SinceKotlin("1.1")
public val visibility: KVisibility?
这样使用:
Car::class.visibility//INTERNAL
在注释处理期间,Kotlin反射不适用。Kotlin反射用于在运行时检查代码。
然而,有一种方法可以解析Kotlin类文件中的元数据,称为
要在注释处理器中使用它,您必须获得
kotlin.Metadata
注释的名称。从该镜像中,获取注释值并使用它们构建KotlinClassHeader
,正如您在kotlinx元数据jvm示例中看到的那样。一旦到了那里,就可以使用kotlinx元数据jvm来提取类的标志。Kotlin反射在注释处理期间不适用。Kotlin反射用于在运行时检查代码。
然而,有一种方法可以解析Kotlin类文件中的元数据,称为
要在注释处理器中使用它,您必须获得
kotlin.Metadata
注释的名称。从该镜像中,获取注释值并使用它们构建KotlinClassHeader
,正如您在kotlinx元数据jvm示例中看到的那样。一旦到了那里,就可以使用kotlinx元数据jvm提取类的标志。我正在这样做,但我看到的是“public”而不是“internal”。使用的代码:(类元素作为符号)。type::class.visibility
x.type::class
将返回符号的KClass。type
akaKClass
,这是一个公共类。如果已处理的类位于类路径上,则加载该类,然后反射到KClass中,将为您提供所需的信息。否则,您需要以某种方式解析kotlin在其所有类中嵌入的@Metadata
注释。我尝试解析元数据,但也没有在那里找到它。我遗漏了什么吗?在图像中,我看到您正在访问.type::class
,这与您认为的不同::class
返回调用它的类型的KClass
,因此既然.type
返回一个com.sun.tools.javac.code.type
,那就是你正在访问的KClass。哦,伙计,你完全正确。我真的不知道如何从注释处理中获取KClass以获取此信息我正在这样做,但我看到的是“public”而不是“internal”。使用的代码:(类元素作为符号)。type::class.visibility
x.type::class
将返回符号的KClass。type
akaKClass
,这是一个公共类。如果已处理的类位于类路径上,则加载该类,然后反射到KClass中,将为您提供所需的信息。否则,您需要以某种方式解析kotlin在其所有类中嵌入的@Metadata
注释。我尝试解析元数据,但也没有在那里找到它。我遗漏了什么吗?在图像中,我看到您正在访问.type::class
,这与您认为的不同::class
返回调用它的类型的KClass
,因此既然.type
返回一个com.sun.tools.javac.code.type
,那就是你正在访问的KClass。哦,伙计,你完全正确。我真的不知道如何从注释处理中获取KClass,以便获得与其他答案相同的信息,我正在这样做,但我收到了“public”:(classElement作为符号)。type::class.visibility
->->public:S。屏幕截图:什么是(classElement作为符号)。type::class
准确地给出了注释处理器的一个KClass。请看截图:截图:我在问题中添加了截图(classElement作为符号)。type::class
给了我一个与另一个答案相同的KClass,我正在这样做,但我收到了“public”:(classElement作为符号)。type::class.visibility
->->public:S。屏幕截图:什么是(classElement作为符号)。type::class
准确地给出了注释处理器的一个KClass。请看截图:截图:我在问题中添加了截图<代码>(classElement作为符号)。type::class给了我一个KClass