Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin反射:如何知道Kotlin类是否标有;“内部”;可见性修改器_Kotlin_Kotlin Reflect_Kotlinpoet - Fatal编程技术网

Kotlin反射:如何知道Kotlin类是否标有;“内部”;可见性修改器

Kotlin反射:如何知道Kotlin类是否标有;“内部”;可见性修改器,kotlin,kotlin-reflect,kotlinpoet,Kotlin,Kotlin Reflect,Kotlinpoet,我正在使用KotlinPoet和自动服务自动生成代码。我没有找到任何方法来知道一个带注释的类是否有“内部”修饰符,这样我就可以用相同的修饰符创建另一个类。例如: @MyAnnotation internal class Car 所以我认为使用Kotlin反射可以得到这些信息,但运气不好 使用注释器处理器,我可以获得KClass,但可见性显示为“public”: 有没有关于如何做的线索?Kotlin的KClass具有visibility属性,可以是KVisibility。INTERNALKot

我正在使用KotlinPoet和自动服务自动生成代码。我没有找到任何方法来知道一个带注释的类是否有“内部”修饰符,这样我就可以用相同的修饰符创建另一个类。例如:

@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.visibilityx.type::class将返回符号的KClass。typeakaKClass,这是一个公共类。如果已处理的类位于类路径上,则加载该类,然后反射到KClass中,将为您提供所需的信息。否则,您需要以某种方式解析kotlin在其所有类中嵌入的
@Metadata
注释。我尝试解析元数据,但也没有在那里找到它。我遗漏了什么吗?在图像中,我看到您正在访问
.type::class
,这与您认为的不同
::class
返回调用它的类型的
KClass
,因此既然
.type
返回一个
com.sun.tools.javac.code.type
,那就是你正在访问的KClass。哦,伙计,你完全正确。我真的不知道如何从注释处理中获取KClass以获取此信息我正在这样做,但我看到的是“public”而不是“internal”。使用的代码:(类元素作为符号)。type::class.visibilityx.type::class将返回符号的KClass。typeakaKClass,这是一个公共类。如果已处理的类位于类路径上,则加载该类,然后反射到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