reflect 包
介绍
reflect
包为用户提供了反射功能,使得程序在运行时能够获取到各种实例的类型信息,并进行各种读写和调用操作。
本包暂不支持 macOS 平台。
注意:
- 仓颉的反射功能只能访问公开的全局变量和全局函数。
- 对于当前所在包,仓颉的反射功能可以访问所有全局定义的类型,而对于外部导入的包或动态加载的模块,则只能访问其中公开的全局定义的类型。
- 仓颉的反射功能只能访问类型内的公开成员(实例/静态成员变量/属性/函数),使用非
public
修饰符修饰的或缺省修饰符的成员均是不可见的。 - 目前,仓颉的反射功能尚不支持
Nothing
类型、函数类型、元组类型、enum
类型和带有泛型的struct
类型。
主要接口
func parseParameterTypes
public func parseParameterTypes(parameterTypes: String): Array<TypeInfo>
功能:将字符串转换为包含具体类型信息的函数签名,以便getStaticFunction
等函数使用。
参数:
parameterTypes
: 函数参数类型字符串。
返回值:字符串对应的参数类型信息。
异常:
- 如果无法将字符串格式错误,则会抛出
IllegalArgumentException
。 - 如果无法获得参数中的类型信息,则会抛出
InfoNotFoundException
异常。
注意:
- 参数类型需要使用限定名称。
parameterTypes
只需要传入函数类型的参数类型部分,不包含参数名、默认值,也不包含最外层的()
。
因此对于下面的一个仓颉函数:
from m1 import p1.T1
func f(a: Int64, b: T1, c!: Int64, d!: Int64 = 0): Int64 { ... }
其 parameterTypes
参数应该为"Int64, m1/p1.T1, Int64, Int64"
。对于无参函数的 parameterTypes
参数应该为 ""
class TypeInfo
sealed abstract class TypeInfo <: Equatable<TypeInfo> & Hashable & ToString
TypeInfo
提供了所有数据类型通用的操作接口,使得开发者通常无需向下转型为更具体的数据类型,如 ClassTypeInfo
等,就能进行反射操作。
TypeInfo
的子类包括 PrimitiveTypeInfo
、StructTypeInfo
、ClassTypeInfo
和 InterfaceTypeInfo
,分别对应基本数据类型,struct
数据类型,class
数据类型和 interface
数据类型的类型信息。
func of
public static func of<T>(): TypeInfo
功能:获取给定类型对应的类型信息。
泛型:
T
:将被获取其类型信息的任意类型。
返回值:T
类型对应的类型信息
异常:
- 如果无法获得类型
T
所对应的类型信息,则会抛出InfoNotFoundException
异常
注意:
- 目前,
T
不支持Nothing
类型、函数类型,元组类型,enum
类型和带有泛型的struct
类型。 T
支持传入类型别名,包括内置类型别名(如Int
、UInt
和Rune
等)与用户自定义类型别名。
func of
public static func of(a: Any): TypeInfo
功能:获取给定的任意类型的实例的运行时类型所对应的类型信息。
参数:
a
:实例
返回值:实例 a
的运行时类型所对应的类型信息
异常:
- 如果无法获得实例
a
的运行时类型所对应的类型信息,则会抛出InfoNotFoundException
异常
注意:
- 目前,实例
a
不支持运行时类型为函数类型,元组类型,enum
类型和带有泛型的struct
类型的实例。
func of
public static func of(a: Object): ClassTypeInfo
功能:获取给定的 class
类型的实例的运行时类型所对应的 class
类型信息。
参数:
a
:class
类型的实例
返回值:class
类型的实例 a
的运行时类型所对应的 class
类型信息
异常:
- 如果无法获得实例
a
的运行时类型所对应的class
类型信息,则会抛出InfoNotFoundException
异常
func get
public static func get(qualifiedName: String): TypeInfo
功能:获取给定的类型的限定名称所对应的类型的类型信息。
参数:
qualifiedName
:类型的限定名称
返回值:类型的限定名称 qualifiedName
所对应的类型的类型信息
异常:
- 如果无法获取与给定类型的限定名称
qualifiedName
匹配的类型所对应的类型信息,则将抛出InfoNotFoundException
异常
注意:
- 未实例化的泛型类型的类型信息无法被获取。
- 目前, 类型的限定名称
qualifiedName
不支持Nothing
类型、函数类型、元组类型、enum
类型和带有泛型的struct
类型的限定名称。
prop name
public prop name: String
功能:获取该类型信息所对应的类型的名称。
注意:
- 该名称不包含任何模块名和包名前缀。
- 类型别名的类型信息就是实际类型其本身的类型信息,所以该函数并不会返回类型别名本身的名称而是实际类型的名称,如类型别名
Rune
的类型信息的名称是Char
而不是Rune
。
prop qualifiedName
public prop qualifiedName: String
功能:获取该类型信息所对应的类型的限定名称。
注意:
- 限定名称包含模块名和包名前缀。
- 特别地,仓颉内置数据类型,以及位于
std
模块core
包下的所有类型的限定名称都是不带有任何模块名和包名前缀的。 - 在缺省模块名和包名的上下文中定义的所有类型,均无模块名前缀,但拥有包名前缀"
default
",如:"default.MyType
"。
prop instanceFunctions
public prop instanceFunctions: Collection<InstanceFunctionInfo>
功能:获取该类型信息所对应的类型所拥有的所有公开实例成员函数的信息所组成的集合。
注意:
- 如果该类型信息所对应的类型无任何公开实例成员函数,则返回空集合。
- 该集合不保证遍历顺序恒定。
- 如果该类型信息所对应的类型是
struct
或class
类型,则该集合包含从其他interface
类型继承而来的非抽象的实例成员函数的信息。
prop staticFunctions
public prop staticFunctions: Collection<StaticFunctionInfo>
功能:获取该类型信息所对应的类型所拥有的所有公开静态成员函数的信息所组成的集合。
注意:
- 如果该类型信息所对应的类型无任何公开静态成员函数,则返回空集合。
- 该集合不保证遍历顺序恒定。
- 如果该类型信息所对应的类型是
struct
、class
或interface
类型,则该集合包含从其他interface
类型继承而来的非抽象的静态成员函数的信息。
prop instanceProperties
public prop instanceProperties: Collection<InstancePropertyInfo>
功能:获取该类型信息所对应的类型所拥有的所有公开实例成员属性的信息所组成的集合。
注意:
- 如果该类型信息所对应的类型无任何公开实例成员属性,则返回空集合。
- 该集合不保证遍历顺序恒定。
- 如果该类型信息所对应的类型是
struct
或class
类型,则该集合包含从其他interface
类型继承而来的非抽象的实例成员属性的信息。
prop staticProperties
public prop staticProperties: Collection<StaticPropertyInfo>
功能:获取该类型信息所对应的类型所拥有的所有公开静态成员属性的信息所组成的集合。
注意:
- 如果该类型信息所对应的类型无任何公开静态成员属性,则返回空集合。
- 该集合不保证遍历顺序恒定。
- 如果该类型信息所对应的类型是
struct
、class
或interface
类型,则该集合包含从其他interface
类型继承而来的非抽象的静态成员属性的信息。
prop superInterfaces
public prop superInterfaces: Collection<InterfaceTypeInfo>
功能:获取该类型信息所对应的类型所直接实现的所有 interface
类型的 interface
类型信息所组成的集合。
注意:
- 所有类型均默认直接实现
interface Any
类型。 - 该集合不保证遍历顺序恒定。
- 目前,
struct
类型只支持获取到interface Any
类型。
prop modifiers
public prop modifiers: Collection<ModifierInfo>
功能:获取该类型信息所对应的类型所拥有的所有修饰符的信息所组成的集合。
注意:
- 如果该类型无任何修饰符,则返回空集合。
- 该集合不保证遍历顺序恒定。
interface
类型默认拥有open
语义,故返回的集合总是包含open
修饰符。- 由于反射功能只能对所有被
public
访问控制修饰符所修饰的类型进行操作,故将忽略所有访问控制修饰符。
prop annotations
public prop annotations: Collection<Annotation>
功能:获取所有作用于该类型信息所对应的类型的注解所组成的集合。
注意:
- 如果无任何注解作用于该类型信息所对应的类型,则返回空集合。
- 该集合不保证遍历顺序恒定。
func isSubtypeOf
public func isSubtypeOf(supertype: TypeInfo): Bool
功能:判断该类型信息所对应的类型是否是给定类型信息所对应的类型的子类型。
参数:
supertype
:目标类型的类型信息
返回值:如果该类型信息所对应的类型是 supertype
所对应的类型的子类型则返回 true
,否则返回 false
注意:
- 由于目前所有
struct
类型均无法获得其实现的interface
类型,所以在做struct
是否为某interface
的子类型的判断时总是返回false
。
func getInstanceFunction
public func getInstanceFunction(name: String, parameterTypes: Array<TypeInfo>): InstanceFunctionInfo
功能:给定函数名称与函数形参类型列表所对应的类型信息列表,尝试获取该类型中匹配的实例成员函数的信息。
参数:
name
:函数名称parameterTypes
:函数形参类型列表所对应的类型信息列表
返回值:如果成功匹配则返回该实例成员函数的信息
func getStaticFunction
public func getStaticFunction(name: String, parameterTypes: Array<TypeInfo>): StaticFunctionInfo
功能:给定函数名称与函数形参类型列表所对应的类型信息列表,尝试获取该类型中匹配的静态成员函数的信息。
参数:
name
: 函数名称parameterTypes
: 函数形参类型列表所对应的类型信息列表
返回值:如果成功匹配则返回该静态成员函数的信息
func getInstanceProperty
public func getInstanceProperty(name: String): InstancePropertyInfo
功能:尝试获取该类型中与给定属性名称匹配的实例成员属性的信息。
参数:
name
: 属性名称
返回值:如果成功匹配则返回该实例成员属性的信息
func getStaticProperty
public func getStaticProperty(name: String): StaticPropertyInfo
功能:尝试获取该类型中与给定属性名称匹配的静态成员属性的信息。
参数:
name
: 属性名称
返回值:如果成功匹配则返回该静态成员属性的信息
func findAnnotation
public func findAnnotation<T>(): Option<T> where T <: Annotation
功能:尝试获取作用于该类型信息所对应的类型且拥有给定限定名称的注解。
参数:
name
:注解的限定名称
返回值:如果成功匹配则返回该注解
func hashCode
public func hashCode(): Int64
功能:获取该类型信息的哈希值。
返回值:该类型信息的哈希值
注意:
- 内部实现为该类型信息的限定名称字符串的哈希值。
func toString
public func toString(): String
功能:获取字符串形式的该类型信息。
返回值:字符串形式的该类型信息
注意:
- 内部实现为该类型信息的限定名称字符串。
operator func ==
public operator func ==(that: TypeInfo): Bool
功能:判断该类型信息与给定的另一个类型信息是否相等。
参数:
that
: 被比较相等性的另一个类型信息
返回值:如果该类型信息与 that
相等则返回 true
,否则返回 false
注意:
- 内部实现为比较两个类型信息的限定名称是否相等。
operator func !=
public operator func !=(that: TypeInfo): Bool
功能:判断该类型信息与给定的另一个类型信息是否不等。
参数:
that
: 被比较相等性的另一个类型信息
返回值:如果该类型信息与 that
不等则返回 true
,否则返回 false
注意:
- 内部实现为比较两个类型信息的限定名称字符串是否不等。
class ClassTypeInfo
public class ClassTypeInfo <: TypeInfo
class
类型的类型信息。
prop constructors
public prop constructors: Collection<ConstructorInfo>
功能:获取该 class
类型信息所对应的 class
类型所拥有的所有公开构造函数的信息所组成的集合。
注意:
- 如果该
class
类型无任何公开构造函数,则返回空集合。 - 该集合不保证遍历顺序恒定。
prop instanceVariables
public prop instanceVariables: Collection<InstanceVariableInfo>
功能:获取该 class
类型信息所对应的 class
类型所拥有的所有公开实例成员变量的信息所组成的集合。
注意:
- 如果该
class
类型无任何公开实例成员变量,则返回空集合。 - 该集合不保证遍历顺序恒定。
- 该集合不包含任何继承而来的公开实例成员变量。
prop staticVariables
public prop staticVariables: Collection<StaticVariableInfo>
功能:获取该 class
类型信息所对应的 class
类型所拥有的所有公开静态成员变量的信息所组成的集合。
注意:
- 如果该
class
类型无任何公开静态成员变量,则返回空集合。 - 该集合不保证遍历顺序恒定。
- 该集合不包含任何继承而来的公开静态成员变量。
prop superClass
public prop superClass: Option<ClassTypeInfo>
功能:获取该 class
类型信息所对应的 class
类型的直接父类,如果存在的话。
注意:
- 理论上只有
class Object
没有直接父类。
prop sealedSubclasses
public prop sealedSubclasses: Collection<ClassTypeInfo>
功能:如果该 class
类型信息所对应的 class
类型拥有 sealed
语义,则获取该 class
类型所在包内的所有子类的类型信息所组成的集合。
注意:
- 如果该
class
类型不拥有sealed
语义,则返回空集合。 - 如果该
class
类型拥有sealed
语义,那么获得的集合必不可能是空集合,因为该class
类型本身就是自己的子类。
func construct
public func construct(args: Array<Any>): Any
功能:在该 class
类型信息所对应的 class
类型中根据实参列表搜索匹配的构造函数并调用,传入实参列表,返回调用结果。
参数:
args
:实参列表
返回值:该 class
类型的实例
异常:
- 如果该
class
类型拥有abstract
语义,调用construct
则会抛出IllegalTypeException
异常,因为抽象类不可被实例化 - 如果
args
未能成功匹配任何该class
类型的公开构造函数,则会抛出MisMatchException
异常 - 在被调用的构造函数内部抛出的任何异常均将被封装为
InvocationTargetException
异常并抛出
func isOpen
public func isOpen(): Bool
功能:判断该 class
类型信息所对应的 class
类型是否拥有 open
语义。
返回值:如果该 class
类型信息所对应的 class
类型拥有 open
语义则返回 true
,否则返回 false
注意:
- 并不是只有被
open
修饰符所修饰的class
类型定义才拥有open
语义,如:abstract class
无论是否被open
修饰符修饰都会拥有open
语义。
func isAbstract
public func isAbstract(): Bool
功能:判断该 class
类型信息所对应的 class
类型是否是抽象类。
返回值:如果该 class
类型信息所对应的 class
类型是抽象类则返回 true
,否则返回 false
func isSealed
public func isSealed(): Bool
功能:判断该 class
类型信息所对应的 class
类型是否拥有 sealed
语义。
返回值:如果该 class
类型信息所对应的 class
类型拥有 sealed
语义则返回 true
,否则返回 false
func getConstructor
public func getConstructor(parameterTypes: Array<TypeInfo>): ConstructorInfo
功能:尝试在该 class
类型信息所对应的 class
类型中获取与给定形参类型信息列表匹配的公开构造函数的信息。
参数:
parameterTypes
: 形参类型信息列表
返回值:如果成功匹配则返回该公开构造函数的信息
func getInstanceVariable
public func getInstanceVariable(name: String): InstanceVariableInfo
功能:给定变量名称,尝试获取该 class
类型信息所对应的 class
类型中匹配的实例成员变量的信息。
参数:
name
: 变量名称
返回值:如果成功匹配则返回该实例成员变量的信息
func getStaticVariable
public func getStaticVariable(name: String): StaticVariableInfo
功能:给定变量名称,尝试获取该 class
类型信息所对应的 class
类型中匹配的静态成员变量的信息。
参数:
name
: 变量名称
返回值:如果成功匹配则返回该静态成员变量的信息
class InterfaceTypeInfo
public class InterfaceTypeInfo <: TypeInfo
interface
类型的类型信息。
prop sealedSubtypes
public prop sealedSubtypes: Collection<TypeInfo>
功能:如果该 interface
类型信息所对应的 interface
类型拥有 sealed
语义,则获取该 interface
类型所在包内的所有子类型的类型信息所组成的集合。
注意:
- 如果该
interface
类型不拥有sealed
语义,则返回空集合。 - 如果该
interface
类型拥有sealed
语义,那么获得的集合必不可能是空集合,因为该interface
类型本身就是自己的子类型。
func isSealed
public func isSealed(): Bool
功能:判断该 interface
类型信息所对应的 interface
类型是否拥有 sealed
语义。
返回值:如果该 interface
类型拥有 sealed
语义则返回 true
,否则返回 false
class PrimitiveTypeInfo
public class PrimitiveTypeInfo <: TypeInfo
原始数据类型的类型信息。
原始数据类型包括无类型(Nothing
)、单元类型(Unit
)、字符类型(Char
)、布尔类型(Bool
),整形类型(Int8
,Int16
,Int32
,Int64
,IntNative
,UInt8
,UInt16
,UInt32
,UInt64
,UIntNative
)和浮点类型(Float16
,Float32
,Float64
)。
注意:
- 目前尚不支持
Nothing
原始数据类型。
class StructTypeInfo
public class StructTypeInfo <: TypeInfo
struct
类型的类型信息。
prop constructors
public prop constructors: Collection<ConstructorInfo>
功能:获取该 struct
类型信息所对应的 struct
类型所拥有的所有公开构造函数的信息所组成的集合。
注意:
- 如果该
struct
类型无任何公开构造函数,则返回空集合。 - 该集合不保证遍历顺序恒定。
prop instanceVariables
public prop instanceVariables: Collection<InstanceVariableInfo>
功能:获取该 struct
类型信息所对应的 struct
类型所拥有的所有公开实例成员变量的信息所组成的集合。
注意:
- 如果该
struct
类型无任何公开实例成员变量,则返回空集合。 - 该集合不保证遍历顺序恒定。
prop staticVariables
public prop staticVariables: Collection<StaticVariableInfo>
功能:获取该 struct
类型信息所对应的 struct
类型所拥有的所有公开静态成员变量的信息所组成的集合。
注意:
- 如果该
struct
类型无任何公开静态成员变量,则返回空集合。 - 该集合不保证遍历顺序恒定。
func construct
public func construct(args: Array<Any>): Any
功能:在该 struct
类型信息所对应的 struct
类型中根据实参列表搜索匹配的构造函数并调用,传入实参列表,返回调用结果。
参数:
args
:实参列表
返回值:该 struct
类型的实例
异常:
- 如果
args
未能成功匹配任何该struct
类型的公开构造函数,则会抛出MisMatchException
异常 - 在被调用的构造函数内部抛出的任何异常均将被封装为
InvocationTargetException
异常并抛出 - 由于
construct
函数本质上调用的是apply
函数,而目前struct
类型中定义的构造函数不支持被调用apply
函数,故该函数目前无法正常使用
func getConstructor
public func getConstructor(parameterTypes: Array<TypeInfo>): ConstructorInfo
功能:尝试在该 struct
类型信息所对应的 struct
类型中获取与给定形参类型信息列表匹配的公开构造函数的信息。
参数:
parameterTypes
: 形参类型信息列表
返回值:如果成功匹配则返回该公开构造函数的信息
func getInstanceVariable
public func getInstanceVariable(name: String): InstanceVariableInfo
功能:给定变量名称,尝试获取该 struct
类型信息所对应的 struct
类型中匹配的实例成员变量的信息。
参数:
name
: 变量名称
返回值:如果成功匹配则返回该实例成员变量的信息
func getStaticVariable
public func getStaticVariable(name: String): StaticVariableInfo
功能:给定变量名称,尝试获取该 struct
类型信息所对应的 struct
类型中匹配的静态成员变量的信息。
参数:
name
: 变量名称
返回值:如果成功匹配则返回该静态成员变量的信息
class InfoList
public class InfoList<T> <: Collection<T>
信息列表,用于保存只读的反射信息。
prop size
public prop size: Int64
功能:获取该信息列表中的元素个数。
func get
public func get(index: Int64): ?T
功能:尝试获取该信息列表指定位置上的元素。
参数:
index
:位置索引
返回值:该信息列表指定位置上的元素
operator func []
public operator func [](index: Int64): T
功能:获取该信息列表指定位置上的元素。
参数:
index
:位置索引
返回值:该信息列表指定位置上的元素
异常:
- 如果
index
超出索引范围,则抛出IndexOutOfBoundsException
异常
func isEmpty
public func isEmpty(): Bool
功能:判断该信息列表是否为空。
返回值:如果该信息列表为空则返回 true
,否则返回 false
func iterator
public func iterator(): Iterator<T>
功能:获取该信息列表的迭代器。
返回值:该信息列表的迭代器
class ConstructorInfo
public class ConstructorInfo <: Equatable<ConstructorInfo> & Hashable & ToString
构造函数信息,实现了运行时构造指定类型的实例的能力。
prop parameters
public prop parameters: InfoList<ParameterInfo>
功能:获取该构造函数信息所对应的构造函数的形参类型列表。
prop annotations
public prop annotations: Collection<Annotation>
功能:获取所有作用于该构造函数信息所对应的构造函数的注解所组成的集合。
注意:
- 如果无任何注解作用于该构造函数信息所对应的构造函数,则返回空集合。
- 该集合不保证遍历顺序恒定。
func apply
public func apply(args: Array<Any>): Any
功能:调用该构造函数信息所对应的构造函数,传入实参列表,并返回调用结果。
参数:
args
: 实参列表
返回值:由该构造函数构造得到的类型实例
异常:
- 如果该构造函数信息所对应的构造函数所属的类型是抽象类,则会抛出
InvocationTargetException
异常 - 如果实参列表
args
中的实参的数目与该构造函数信息所对应的构造函数的形参列表中的形参的数目不等,则会抛出IllegalArgumentException
异常 - 如果实参列表
args
中的任何一个实参的运行时类型不是该构造函数信息所对应的构造函数的对应形参的声明类型的子类型,则会抛出IllegalTypeException
异常 - 如果被调用的构造函数信息所对应的构造函数内部抛出异常,则该异常将被封装为
Exception
异常并抛出
注意:
- 目前,实参不支持
struct
类型的实例。 - 目前,
struct
类型中定义的构造函数不支持被调用。
func findAnnotation
public func findAnnotation<T>(): Option<T> where T <: Annotation
功能:尝试获取作用于该构造函数信息所对应的构造函数且拥有给定限定名称的注解。
参数:
name
:注解的限定名称
返回值:如果成功匹配则返回该注解
func hashCode
public func hashCode(): Int64
功能:获取该构造器信息的哈希值。
返回值:该构造器信息的哈希值
func toString
public func toString(): String
功能:获取字符串形式的该构造函数信息。
返回值:字符串形式的该构造函数信息
operator func ==
public operator func ==(that: ConstructorInfo): Bool
功能:判断该构造器信息与给定的另一个构造器信息是否相等。
参数:
that
: 被比较相等性的另一个构造器信息
返回值:如果该构造器信息与 that
相等则返回 true
,否则返回 false
operator func !=
public operator func !=(that: ConstructorInfo): Bool
功能:判断该构造器信息与给定的另一个构造器信息是否不等。
参数:
that
: 被比较相等性的另一个构造器信息
返回值:如果该构造器信息与 that
不等则返回 true
,否则返回 false
class ParameterInfo
public class ParameterInfo <: Equatable<ParameterInfo> & Hashable & ToString
函数形参信息。
prop index
public prop index: Int64
功能:获知该函数形参信息所对应的形参是其所在函数的第几个形参。
注意:
index
从0开始计数。
prop name
public prop name: String
功能:获取该函数形参信息所对应的形参的名称。
prop typeInfo
public prop typeInfo: TypeInfo
功能:获取该函数形参信息所对应的函数形参的声明类型所对应的类型信息。
prop annotations
public prop annotations: Collection<Annotation>
功能:获取所有作用于该函数形参信息所对应的函数形参的注解所组成的集合。
注意:
- 如果无任何注解作用于该函数形参信息所对应的函数形参,则返回空集合。
- 该集合不保证遍历顺序恒定。
func findAnnotation
public func findAnnotation<T>(): Option<T> where T <: Annotation
功能:尝试获取作用于该函数形参信息所对应的函数形参且拥有给定限定名称的注解。
参数:
name
:注解的限定名称
返回值:如果成功匹配则返回该注解
func hashCode
public func hashCode(): Int64
功能:获取该函数形参信息的哈希值。
返回值:该函数形参信息的哈希值
func toString
public func toString(): String
功能:获取字符串形式的该函数形参信息。
返回值:字符串形式的该函数形参信息
operator func ==
public operator func ==(that: ParameterInfo): Bool
功能:判断该函数形参信息与给定的另一个函数形参信息是否相等。
参数:
that
: 被比较相等性的另一个函数形参信息
返回值:如果该函数形参信息与 that
相等则返回 true
,否则返回 false
operator func !=
public operator func !=(that: ParameterInfo): Bool
功能:判断该函数形参信息与给定的另一个函数形参信息是否不等。
参数:
that
: 被比较相等性的另一个函数形参信息
返回值:如果该函数形参信息与 that
不等则返回 true
,否则返回 false
enum ModifierInfo
public enum ModifierInfo <: Equatable<ModifierInfo> & Hashable & ToString {
| Open
| Override
| Redef
| Abstract
| Sealed
| Mut
| Static
}
修饰符信息。
注意:
- 由于开发者通过反射功能获取到的类型信息均来自于公开的类型,这些类型都必定拥有
public
的访问控制语义,因此修饰符信息并不包含任何访问控制相关的修饰符。
Open
open
修饰符。
Override
override
修饰符。
Redef
redef
修饰符。
Abstract
abstract
修饰符。
Sealed
sealed
修饰符。
Mut
mut
修饰符。
Static
static
修饰符。
func hashCode
public func hashCode(): Int64
功能:获取该修饰符信息的哈希值。
返回值:该修饰符信息的哈希值
注意:
- 内部实现为该修饰符关键字字符串的哈希值。
operator func ==
public operator func ==(that: ModifierInfo): Bool
功能:判断该修饰符信息与给定的另一个修饰符信息是否相等。
参数:
that
:被比较相等性的另一个修饰符信息
返回值:如果该修饰符信息与 that
相等则返回 true
,否则返回 false
注意:
- 修饰符信息的相等性的语义等价于
enum
类型实例的相等性的语义。
operator func !=
public operator func !=(that: ModifierInfo): Bool
功能:判断该修饰符信息与给定的另一个修饰符信息是否不等。
参数:
that
:被比较相等性的另一个修饰符信息
返回值:如果该修饰符信息与 that
不等则返回 true
,否则返回 false
注意:
- 修饰符信息的相等性的语义等价于
enum
类型实例的相等性的语义。
func toString
public func toString(): String
功能:获取字符串形式的该修饰符信息。
返回值:字符串形式的该修饰符信息
注意:
- 字符串形式的修饰符信息即为修饰符关键字的标识符。
class InstanceFunctionInfo
public class InstanceFunctionInfo <: Equatable<InstanceFunctionInfo> & Hashable & ToString
实例成员函数信息。
prop name
public prop name: String
功能:获取该实例成员函数信息所对应的实例成员函数的名称。
注意:
- 构成重载的所有实例成员函数将拥有相同的名称。
- 操作符重载函数的名称就是该操作符本身的符号内容,如"
+
","*
","[]
"。
prop parameters
public prop parameters: InfoList<ParameterInfo>
功能:获取该实例成员函数信息所对应的实例成员函数的形参信息列表。
prop returnType
public prop returnType: TypeInfo
功能:获取该实例成员函数信息所对应的实例成员函数的返回值类型的类型信息。
prop modifiers
public prop modifiers: Collection<ModifierInfo>
功能:获取该实例成员函数信息所对应的实例成员函数所拥有的所有修饰符的信息所组成的集合。
注意:
- 如果该实例成员函数无任何修饰符,则返回空集合。
- 该集合不保证遍历顺序恒定。
- 即便未被某修饰符修饰,如果拥有该修饰符的语义,该修饰符信息也将被包括在该集合中。
prop annotations
public prop annotations: Collection<Annotation>
功能:获取所有作用于该实例成员函数信息所对应的实例成员函数的注解所组成的集合。
注意:
- 如果无任何注解作用于该实例成员函数信息所对应的实例成员函数,则返回空集合。
- 该集合不保证遍历顺序恒定。
func isOpen
public func isOpen(): Bool
功能:判断该实例成员函数信息所对应的实例成员函数是否拥有 open
语义。
返回值:如果该实例成员函数拥有 open
语义则返回 true
,否则返回 false
注意:
interface
类型中的实例成员函数默认均拥有open
语义。
func isAbstract
public func isAbstract(): Bool
功能:判断该实例成员函数信息所对应的实例成员函数是否拥有 abstract
语义。
返回值:如果该实例成员函数拥有 abstract
语义则返回 true
,否则返回 false
func apply
public func apply(instance: Any, args: Array<Any>): Any
功能:调用该实例成员函数信息所对应实例成员函数,指定实例并传入实参列表,返回调用结果。
参数:
instance
:实例args
:实参列表
返回值:该实例成员函数的调用结果
异常:
- 如果该实例成员函数信息所对应的实例成员函数是抽象的,则会抛出
InvocationTargetException
异常 - 如果实例
instance
的运行时类型与该实例成员函数信息所对应的实例成员函数所属的类型不严格相同,则会抛出IllegalTypeException
异常 - 如果实参列表
args
中的实参的数目与该实例成员函数信息所对应的实例成员函数的形参列表中的形参的数目不等,则会抛出IllegalArgumentException
异常 - 如果实参列表
args
中的任何一个实参的运行时类型不是该实例成员函数信息所对应的实例成员函数的对应形参的声明类型的子类型,则会抛出IllegalTypeException
异常 - 如果被调用的实例成员函数信息所对应的实例成员函数内部抛出异常,则该异常将被封装为
Exception
异常并抛出
注意:
- 目前,实例
instance
不支持struct
类型的实例。 - 目前,实参不支持
struct
类型的实例。
func findAnnotation
public func findAnnotation<T>(): Option<T> where T <: Annotation
功能:尝试获取作用于该实例成员函数信息所对应的实例成员函数且拥有给定限定名称的注解。
参数:
name
:注解的限定名称
返回值:如果成功匹配则返回该注解
func hashCode
public func hashCode(): Int64
功能:获取该实例成员函数信息的哈希值。
返回值:该实例成员函数信息的哈希值
func toString
public func toString(): String
功能:获取字符串形式的该实例成员函数信息。
返回值:字符串形式的该实例成员函数信息
operator func ==
public operator func ==(that: InstanceFunctionInfo): Bool
功能:判断该实例成员函数信息与给定的另一个实例成员函数信息是否相等。
参数:
that
: 被比较相等性的另一个实例成员函数信息
返回值:如果该实例成员函数信息与 that
相等则返回 true
,否则返回 false
operator func !=
public operator func !=(that: InstanceFunctionInfo): Bool
功能:判断该实例成员函数信息与给定的另一个实例成员函数信息是否不等。
参数:
that
: 被比较相等性的另一个实例成员函数信息
返回值:如果该实例成员函数信息与 that
不等则返回 true
,否则返回 false
class StaticFunctionInfo
public class StaticFunctionInfo <: Equatable<StaticFunctionInfo> & Hashable & ToString
静态成员函数信息。
prop name
public prop name: String
功能:获取该静态成员函数信息所对应的静态成员函数的名称。
注意:
- 构成重载的所有静态成员函数将拥有相同的名称。
prop parameters
public prop parameters: InfoList<ParameterInfo>
功能:获取该静态成员函数信息所对应的静态成员函数的形参信息列表。
prop returnType
public prop returnType: TypeInfo
功能:获取该静态成员函数信息所对应的静态成员函数的返回值类型的类型信息。
prop modifiers
public prop modifiers: Collection<ModifierInfo>
功能:获取该静态成员函数信息所对应的静态成员函数所拥有的所有修饰符的信息所组成的集合。
注意:
- 如果该静态成员函数无任何修饰符,则返回空集合。
- 该集合不保证遍历顺序恒定。
- 即便未被某修饰符修饰,如果拥有该修饰符的语义,该修饰符信息也将被包括在该集合中。
prop annotations
public prop annotations: Collection<Annotation>
功能:获取所有作用于该静态成员函数信息所对应的静态成员函数的注解所组成的集合。
注意:
- 如果无任何注解作用于该静态成员函数信息所对应的静态成员函数,则返回空集合。
- 该集合不保证遍历顺序恒定。
func apply
public func apply(args: Array<Any>): Any
功能:调用该静态成员函数信息所对应静态成员函数,传入实参列表并返回调用结果。
参数:
args
:实参列表
返回值:该静态成员函数的调用结果
异常:
- 如果实参列表
args
中的实参的数目与该静态成员函数信息所对应的静态成员函数的形参列表中的形参的数目不等,则会抛出IllegalArgumentException
异常 - 如果实参列表
args
中的任何一个实参的运行时类型不是该静态成员函数信息所对应的静态成员函数的对应形参的声明类型的子类型,则会抛出IllegalTypeException
异常 - 如果被调用的静态成员函数信息所对应的静态成员函数内部抛出异常,则该异常将被封装为
Exception
异常并抛出
注意:
- 目前,实参不支持
struct
类型的实例。
func findAnnotation
public func findAnnotation<T>(): Option<T> where T <: Annotation
功能:尝试获取作用于该静态成员函数信息所对应的静态成员函数且拥有给定限定名称的注解。
参数:
name
:注解的限定名称。
返回值:如果成功匹配则返回该注解
func hashCode
public func hashCode(): Int64
功能:获取该静态成员函数信息的哈希值。
返回值:该静态成员函数信息的哈希值
func toString
public func toString(): String
功能:获取字符串形式的该静态成员函数信息。
返回值:字符串形式的该静态成员函数信息
operator func ==
public operator func ==(that: StaticFunctionInfo): Bool
功能:判断该静态成员函数信息与给定的另一个静态成员函数信息是否相等。
参数:
that
: 被比较相等性的另一个静态成员函数信息
返回值:如果该静态成员函数信息与 that
相等则返回 true
,否则返回 false
operator func !=
public operator func !=(that: StaticFunctionInfo): Bool
功能:判断该静态成员函数信息与给定的另一个静态成员函数信息是否不等。
参数:
that
: 被比较相等性的另一个静态成员函数信息
返回值:如果该静态成员函数信息与 that
不等则返回 true
,否则返回 false
class InstancePropertyInfo
public class InstancePropertyInfo <: Equatable<InstancePropertyInfo> & Hashable & ToString
实例成员属性信息。
prop name
public prop name: String
功能:获取该实例成员属性信息所对应的实例成员属性的名称。
prop typeInfo
public prop typeInfo: TypeInfo
功能:获取该实例成员属性信息所对应的实例成员属性的声明类型的类型信息。
prop modifiers
public prop modifiers: Collection<ModifierInfo>
功能:获取该实例成员属性信息所对应的实例成员属性所拥有的所有修饰符的信息所组成的集合。
注意:
- 如果该实例成员属性无任何修饰符,则返回空集合。
- 该集合不保证遍历顺序恒定。
- 即便未被某修饰符修饰,如果拥有该修饰符的语义,该修饰符信息也将被包括在该集合中。
prop annotations
public prop annotations: Collection<Annotation>
功能:获取所有作用于该实例成员属性信息所对应的实例成员属性的注解所组成的集合。
注意:
- 如果无任何注解作用于该实例成员属性信息所对应的实例成员属性,则返回空集合。
- 该集合不保证遍历顺序恒定。
func isMutable
public func isMutable(): Bool
功能:判断该实例成员属性信息所对应的实例成员属性是否可修改。
返回值:如果该实例成员属性信息所对应的实例成员属性可被修改则返回 true
,否则返回 false
注意:
- 如果实例成员属性被
mut
修饰符所修饰,则该实例成员属性可被修改,否则不可被修改。 - 任何
struct
类型的实例的任何实例成员属性均不可修改。 - 任何类型为
struct
的实例成员属性均不可修改。
func getValue
public func getValue(instance: Any): Any
功能:获取该实例成员属性信息所对应的实例成员属性在给定实例中的值。
参数:
instance
:实例
返回值:该实例成员属性在实例 instance
中的值
异常:
- 如果实例
instance
的运行时类型与该实例成员属性信息所对应的实例成员属性所属的类型不严格相同,则会抛出IllegalTypeException
异常
注意:
- 目前,实例
instance
不支持struct
类型的实例。
func setValue
public func setValue(instance: Any, newValue: Any): Unit
功能:设置该实例成员属性信息所对应的实例成员属性在给定实例中的值。
参数:
instance
:实例newValue
:新值
异常:
- 如果该实例成员属性信息所对应的实例成员属性不可修改,则会抛出
IllegalSetException
异常 - 如果实例
instance
的运行时类型与该实例成员属性信息所对应的实例成员属性所属的类型不严格相同,则会抛出IllegalTypeException
异常 - 如果新值
newValue
的运行时类型不是该实例成员属性信息所对应的实例成员属性的声明类型的子类型,则会抛出IllegalTypeException
异常。
注意:
- 目前,实例
instance
不支持struct
类型的实例。
func findAnnotation
public func findAnnotation<T>(): Option<T> where T <: Annotation
功能:尝试获取作用于该实例成员属性信息所对应的实例成员属性且拥有给定限定名称的注解。
参数:
name
:注解的限定名称
返回值:如果成功匹配则返回该注解
func hashCode
public func hashCode(): Int64
功能:获取该实例成员属性信息的哈希值。
返回值:该实例成员属性信息的哈希值
func toString
public func toString(): String
功能:获取字符串形式的该实例成员属性信息
返回值:字符串形式的该实例成员属性信息
operator func ==
public operator func ==(that: InstancePropertyInfo): Bool
功能:判断该实例成员属性信息与给定的另一个实例成员属性信息是否相等。
参数:
that
: 被比较相等性的另一个实例成员属性信息
返回值:如果该实例成员属性信息与 that
相等则返回 true
,否则返回 false
operator func !=
public operator func !=(that: InstancePropertyInfo): Bool
功能:判断该实例成员属性信息与给定的另一个实例成员属性信息是否不等。
参数:
that
: 被比较相等性的另一个实例成员属性信息
返回值:如果该实例成员属性信息与 that
不等则返回 true
,否则返回 false
class StaticPropertyInfo
public class StaticPropertyInfo <: Equatable<StaticPropertyInfo> & Hashable & ToString
静态成员属性信息。
prop name
public prop name: String
功能:获取该静态成员属性信息所对应的静态成员属性的名称。
prop typeInfo
public prop typeInfo: TypeInfo
功能:获取该静态成员属性信息所对应的静态成员属性的声明类型的类型信息。
prop modifiers
public prop modifiers: Collection<ModifierInfo>
功能:获取该静态成员属性信息所对应的静态成员属性所拥有的所有修饰符的信息所组成的集合。
注意:
- 如果该静态成员属性无任何修饰符,则返回空集合。
- 该集合不保证遍历顺序恒定。
- 目前获取到的修饰符集合内容较为混乱,尚未统一。
prop annotations
public prop annotations: Collection<Annotation>
功能:获取所有作用于该静态成员属性信息所对应的静态成员属性的注解所组成的集合。
注意:
- 如果无任何注解作用于该静态成员属性信息所对应的静态成员属性,则返回空集合。
- 该集合不保证遍历顺序恒定。
func isMutable
public func isMutable(): Bool
功能:判断该静态成员属性信息所对应的静态成员属性是否可修改。
返回值:如果该静态成员属性信息所对应的静态成员属性可被修改则返回 true
,否则返回 false
注意:
- 如果静态成员属性被
mut
修饰符所修饰,则该静态成员属性可被修改,否则不可被修改。 - 任何
struct
类型的任何静态成员属性均不可修改。 - 任何类型为
struct
的静态成员属性均不可修改。
func getValue
public func getValue(): Any
功能:获取该静态成员属性信息所对应的静态成员属性的值。
返回值:该静态成员属性的值
注意:
- 如果该静态成员属性缺少合法实现,如
interface
类型中的抽象静态成员属性,则应抛出UnsupportedException
异常,但由于后端尚未支持,故尚未实现。
func setValue
public func setValue(newValue: Any): Unit
功能:设置该静态成员属性信息所对应的静态成员属性的值。
参数:
newValue
:新值
异常:
- 如果该静态成员属性信息所对应的静态成员属性不可修改,则会抛出
IllegalSetException
异常 - 如果新值
newValue
的运行时类型不是该静态成员属性信息所对应的静态成员属性的声明类型的子类型,则会抛出IllegalTypeException
异常
注意:
- 如果该静态成员属性缺少合法实现,如
interface
类型中的抽象静态成员属性,则应抛出UnsupportedException
异常,但由于后端尚未支持,故尚未实现。
func findAnnotation
public func findAnnotation<T>(): Option<T> where T <: Annotation
功能:尝试获取作用于该静态成员属性信息所对应的静态成员属性且拥有给定限定名称的注解。
参数:
name
:注解的限定名称
返回值:如果成功匹配则返回该注解
func hashCode
public func hashCode(): Int64
功能:获取该静态成员属性信息的哈希值。
返回值:该静态成员属性信息的哈希值
func toString
public func toString(): String
功能:获取字符串形式的该静态成员属性信息。
返回值:字符串形式的该静态成员属性信息
operator func ==
public operator func ==(that: StaticPropertyInfo): Bool
功能:判断该静态成员属性信息与给定的另一个静态成员属性信息是否相等。
参数:
that
: 被比较相等性的另一个静态成员属性信息
返回值:如果该静态成员属性信息与 that
相等则返回 true
,否则返回 false
operator func !=
public operator func !=(that: StaticPropertyInfo): Bool
功能:判断该静态成员属性信息与给定的另一个静态成员属性信息是否不等。
参数:
that
: 被比较相等性的另一个静态成员属性信息
返回值:如果该静态成员属性信息与 that
不等则返回 true
,否则返回 false
class InstanceVariableInfo
public class InstanceVariableInfo <: Equatable<InstanceVariableInfo> & Hashable & ToString
实例成员变量信息。
prop name
public prop name: String
功能:获取该实例成员变量信息所对应的实例成员变量的名称。
prop typeInfo
public prop typeInfo: TypeInfo
功能:获取该实例成员变量信息所对应的实例成员变量的声明类型的类型信息。
prop modifiers
public prop modifiers: Collection<ModifierInfo>
功能:获取该实例成员变量信息所对应的实例成员变量所拥有的所有修饰符的信息所组成的集合。
注意:
- 如果该实例成员变量无任何修饰符,则返回空集合。
- 该集合不保证遍历顺序恒定。
- 即便未被某修饰符修饰,如果拥有该修饰符的语义,该修饰符信息也将被包括在该集合中。
prop annotations
public prop annotations: Collection<Annotation>
功能:获取所有作用于该实例成员变量信息所对应的实例成员变量的注解所组成的集合。
注意:
- 如果无任何注解作用于该实例成员变量信息所对应的实例成员变量,则返回空集合。
- 该集合不保证遍历顺序恒定。
func isMutable
public func isMutable(): Bool
功能:判断该实例成员变量信息所对应的实例成员变量是否可修改。
返回值:如果该实例成员变量信息所对应的实例成员变量可被修改则返回 true
,否则返回 false
。
注意:
- 如果实例成员变量被
var
修饰符所修饰,则该实例成员变量可被修改。 - 如果实例成员变量被
let
修饰符所修饰,则该实例成员变量不可被修改。 - 任何
struct
类型的实例的任何实例成员变量均不可修改。 - 任何类型为
struct
的实例成员变量均不可修改。
func getValue
public func getValue(instance: Any): Any
功能:获取该实例成员变量信息所对应的实例成员变量在给定实例中的值。
参数:
instance
:实例
返回值:该实例成员变量在实例 instance
中的值
异常:
- 如果实例
instance
的运行时类型与该实例成员变量信息所对应的实例成员变量所属的类型不严格相同,则会抛出IllegalTypeException
异常
注意:
- 目前,实例
instance
不支持struct
类型的实例。 - 目前,返回值不支持为
struct
类型的实例。
func setValue
public func setValue(instance: Any, newValue: Any): Unit
功能:设置该实例成员变量信息所对应的实例成员变量在给定实例中的值。
参数:
instance
:实例newValue
:新值
异常:
- 如果该实例成员变量信息所对应的实例成员变量不可修改,则会抛出
IllegalSetException
异常 - 如果实例
instance
的运行时类型与该实例成员变量信息所对应的实例成员变量所属的类型不严格相同,则会抛出IllegalTypeException
异常 - 如果新值
newValue
的运行时类型不是该实例成员变量信息所对应的实例成员变量的声明类型的子类型,则会抛出IllegalTypeException
异常
注意:
- 目前,实例
instance
不支持struct
类型的实例。
func findAnnotation
public func findAnnotation<T>(): Option<T> where T <: Annotation
功能:尝试获取作用于该实例成员变量信息所对应的实例成员变量且拥有给定限定名称的注解。
参数:
name
:注解的限定名称
返回值:如果成功匹配则返回该注解
func hashCode
public func hashCode(): Int64
功能:获取该实例成员变量信息的哈希值。
返回值:该实例成员变量信息的哈希值
func toString
public func toString(): String
功能:获取字符串形式的该实例成员变量信息。
返回值:字符串形式的该实例成员变量信息
operator func ==
public operator func ==(that: InstanceVariableInfo): Bool
功能:判断该实例成员变量信息与给定的另一个实例成员变量信息是否相等。
参数:
that
: 被比较相等性的另一个实例成员变量信息
返回值:如果该实例成员变量信息与 that
相等则返回 true
,否则返回 false
operator func !=
public operator func !=(that: InstanceVariableInfo): Bool
功能:判断该实例成员变量信息与给定的另一个实例成员变量信息是否不等。
参数:
that
: 被比较相等性的另一个实例成员变量信息
返回值:如果该实例成员变量信息与 that
不等则返回 true
,否则返回 false
class StaticVariableInfo
public class StaticVariableInfo <: Equatable<StaticVariableInfo> & Hashable & ToString
静态成员变量信息。
prop name
public prop name: String
功能:获取该静态成员变量信息所对应的静态成员变量的名称。
prop typeInfo
public prop typeInfo: TypeInfo
功能:获取该静态成员变量信息所对应的静态成员变量的声明类型的类型信息。
prop modifiers
public prop modifiers: Collection<ModifierInfo>
功能:获取该静态成员变量信息所对应的静态成员变量所拥有的所有修饰符的信息所组成的集合。
注意:
- 如果该静态成员变量无任何修饰符,则返回空集合。
- 该集合不保证遍历顺序恒定。
- 目前获取到的修饰符集合内容较为混乱,尚未统一。
prop annotations
public prop annotations: Collection<Annotation>
功能:获取所有作用于该静态成员变量信息所对应的静态成员变量的注解所组成的集合。
注意:
- 如果无任何注解作用于该静态成员变量信息所对应的静态成员变量,则返回空集合。
- 该集合不保证遍历顺序恒定。
func isMutable
public func isMutable(): Bool
功能:判断该静态成员变量信息所对应的静态成员变量是否可修改。
返回值:如果该静态成员变量信息所对应的静态成员变量可被修改则返回 true
,否则返回 false
注意:
- 如果静态成员变量被
var
修饰符所修饰,则该静态成员变量可被修改。 - 如果静态成员变量被
let
修饰符所修饰,则该静态成员变量不可被修改。 - 任何
struct
类型的任何静态成员变量均不可修改。 - 任何类型为
struct
的静态成员变量均不可修改。
func getValue
public func getValue(): Any
功能:获取该静态成员变量信息所对应的静态成员变量的值。
返回值:该静态成员变量的值
注意:
- 返回值不支持为
struct
类型。
func setValue
public func setValue(newValue: Any): Unit
功能:设置该静态成员变量信息所对应的静态成员变量的值。
参数:
newValue
:新值
异常:
- 如果该静态成员变量信息所对应的静态成员变量不可修改,则会抛出
IllegalSetException
异常 - 如果新值
newValue
的运行时类型不是该静态成员变量信息所对应的静态成员变量的声明类型的子类型,则会抛出IllegalTypeException
异常
func findAnnotation
public func findAnnotation<T>(): Option<T> where T <: Annotation
功能:尝试获取作用于该静态成员变量信息所对应的静态成员变量且拥有给定限定名称的注解。
参数:
name
:注解的限定名称
返回值:如果成功匹配则返回该注解
func hashCode
public func hashCode(): Int64
功能:获取该静态成员变量信息的哈希值。
返回值:该静态成员变量信息的哈希值
func toString
public func toString(): String
功能:获取字符串形式的该静态成员变量信息。
返回值:字符串形式的该静态成员变量信息
operator func ==
public operator func ==(that: StaticVariableInfo): Bool
功能:判断该静态成员变量信息与给定的另一个静态成员变量信息是否相等。
参数:
that
: 被比较相等性的另一个静态成员变量信息
返回值:如果该静态成员变量信息与 that
相等则返回 true
,否则返回 false
operator func !=
public operator func !=(that: StaticVariableInfo): Bool
功能:判断该静态成员变量信息与给定的另一个静态成员变量信息是否不等。
参数:
that
: 被比较相等性的另一个静态成员变量信息
返回值:如果该静态成员变量信息与 that
不等则返回 true
,否则返回 false
class ModuleInfo
public class ModuleInfo <: Equatable<ModuleInfo> & Hashable & ToString
模块信息,提供了仓颉动态模块加载、缓存能力以及模块内包信息查询能力。
仓颉动态模块是仓颉编译器生成的一种特殊二进制文件,这种文件可以被外部的仓颉程序在运行时被加载与使用。
仓颉动态库模块在不同操作系统中以共享库(.so
文件)、动态链接库(.dll
文件)等文件形式存在。
注意:
- 任一模块下不允许包含拥有相同限定名称的包。
prop name
public prop name: String
功能:获取该模块信息所对应的模块的名称。
注意:
- 模块的名称由被加载的模块的文件名决定,该文件名的格式为
lib<module_name>_<package_name>(.<package_name>)*
。 <module_name>
和<package_name>
均不允许为空。- 由于当前实现的局限性,
<module_name>
中如果包含下划线 "_
" 字符,可能出现非预期的加载错误。
prop version
public prop version: String
功能:获取该模块信息所对应的模块的版本号。
注意:
- 由于目前动态库中尚无版本信息,获取到的版本号总是
1.0
。
prop packages
public prop packages: Collection<PackageInfo>
功能:获取该模块中包含的所有包。
func load
public static func load(path: String): ModuleInfo
功能:运行时动态加载指定路径下的一个仓颉动态库模块并获得该模块的信息。
参数:
path
:共享库文件的绝对路径或相对路径
异常:
- 如果共享库加载失败,则会抛出
ReflectException
异常 - 如果具有相同模块名称的共享库被重复加载,则会抛出
UnsupportedException
异常
注意:
- 为了提升兼容性,路径
path
中的共享库文件名不需要后缀名(如.so
和.dll
等)。 - 由于当前实现局限性,具有相同模块名称的动态库不能被同时加载,否则将抛出异常。如
m/a
、m/a.b
、m/a.c
这三个包所对应的共享库的加载是互斥的。
func find
public static func find(moduleName: String): Option<ModuleInfo>
功能:尝试在所有已加载的仓颉动态库模块中获取与给定模块名称匹配的模块的信息。
参数:
moduleName
:仓颉动态库模块名称
返回值:如果匹配成功则返回该模块的信息
func getPackageInfo
public func getPackageInfo(packageName: String): PackageInfo
功能:尝试在该模块信息所对应的模块中获取与给定包的名称或限定名称匹配的包的信息。
参数:
packageName
:包的名称或限定名称
返回值:如果匹配成功则返回该包的信息
func hashCode
public func hashCode(): Int64
功能:获取该模块信息的哈希值。
返回值:该模块信息的哈希值
注意:
-内部实现为该模块信息的名称和版本号字符串的哈希值
func toString
public func toString(): String
功能:获取字符串形式的该模块信息。
返回值:字符串形式的该模块信息
注意:
- 内容为该模块的名称和版本号。
operator func ==
public operator func ==(that: ModuleInfo): Bool
功能:判断该模块信息与给定的另一个模块信息是否相等。
参数:
that
: 被比较相等性的另一个模块信息
返回值:如果该模块信息与 that
相等则返回 true
,否则返回 false
operator func !=
public operator func !=(that: ModuleInfo): Bool
功能:判断该模块信息与给定的另一个模块信息是否不等。
参数:
that
: 被比较相等性的另一个模块信息
返回值:如果该模块信息与 that
不等则返回 true
,否则返回 false
class PackageInfo
public class PackageInfo <: Equatable<PackageInfo> & Hashable & ToString
包信息。
prop name
public prop name: String
功能:获取该包信息所对应的包的名称。
注意:
- 包的名称不包含其所在的模块名称和其父包的名称,例如限定名称为
a/b.c.d
的包的名称是d
。
prop qualifiedName
public prop qualifiedName: String
功能:获取该包信息所对应的包的限定名称。
注意:
- 包的限定名称的格式是
(module_name/)?(default|package_name)(.package_name)*
,例如限定名称为a/b.c.d
的包位于模块a
下的b
包里的c
包里。
prop typeInfos
public prop typeInfos: Collection<TypeInfo>
功能:获取该包信息所对应的包中所有全局定义的公开类型的类型信息所组成的列表。
注意:
- 目前该列表不包含所有反射尚未支持的类型。
prop variables
public prop variables: Collection<GlobalVariableInfo>
功能:获取该包信息所对应的包中所有公开全局变量的信息所组成的列表。
prop functions
public prop functions: Collection<GlobalFunctionInfo>
功能:获取该包信息所对应的包中所有公开全局函数的信息所组成的列表。
func getTypeInfo
public func getTypeInfo(qualifiedName: String): TypeInfo
功能:尝试在该包信息所对应的包中获取拥有给定类型名称的全局定义的公开类型的类型信息。
参数:
qualifiedName
:类型的限定名称
返回值:如果成功匹配则返回该全局定义的公开类型的类型信息
func getVariable
public func getVariable(name: String): GlobalVariableInfo
功能:尝试在该包信息所对应的包中获取拥有给定变量名称的公开全局变量的信息。
参数:
name
:全局变量的名称
func getFunction
public func getFunction(name: String, parameterTypes: Array<TypeInfo>): GlobalFunctionInfo
功能:尝试在该包信息所对应的包中获取拥有给定函数名称且与给定形参类型信息列表匹配的公开全局函数的信息。
参数:
name
:全局函数的名称parameterTypes
:形参类型信息列表
operator func ==
public operator func ==(that: PackageInfo): Bool
功能:判断该包信息与给定的另一个包信息是否相等。
参数:
that
:被比较相等性的另一个包信息
返回值:如果该包信息与 that
相等则返回 true
,否则返回 false
注意:
- 内部实现为比较两个包信息的限定名称是否相等。
operator func !=
public operator func !=(that: PackageInfo): Bool
功能:判断该包信息与给定的另一个包信息是否不等。
参数:
that
:被比较相等性的另一个包信息
返回值:如果该包信息与 that
不等则返回 true
,否则返回 false
注意:
- 内部实现为比较两个包信息的限定名称是否相等。
func hashCode
public func hashCode(): Int64
功能:获取该包信息的哈希值。
返回值:该包信息的哈希值
func toString
public func toString(): String
功能:获取字符串形式的该包信息。
返回值:字符串形式的该包信息
注意:
- 内部实现为该包信息的限定名称字符串。
class GlobalFunctionInfo
public class GlobalFunctionInfo <: Equatable<GlobalFunctionInfo> & Hashable & ToString
全局函数信息。
prop name
public prop name: String
功能:获取该全局函数信息所对应的全局函数的名称。
注意:
- 构成重载的所有全局函数将拥有相同的名称。
prop parameters
public prop parameters: InfoList<ParameterInfo>
功能:获取该全局函数信息所对应的全局函数的形参信息列表。
prop returnType
public prop returnType: TypeInfo
功能:获取该全局函数信息所对应的全局函数的返回类型的类型信息。
func apply
public func apply(args: Array<Any>): Any
功能:调用该全局函数信息所对应的全局函数,传入实参列表,返回调用结果。
参数:
args
:实参列表
返回值:该全局函数的调用结果
异常:
- 如果实参列表
args
中的实参的数目与该全局函数信息所对应的全局函数的形参列表中的形参的数目不等,则会抛出IllegalArguemntException
异常 - 如果实参列表
args
中的任何一个实参的运行时类型不是该全局函数信息所对应的全局函数的对应形参的声明类型的子类型,则会抛出IllegalTypeException
异常 - 如果被调用的全局函数信息所对应全局函数内部抛出异常,则该异常将被封装为
Exception
异常并抛出
注意:
- 目前,实参不支持
struct
类型的实例。
func hashCode
public func hashCode(): Int64
功能:获取该全局函数信息的哈希值。
返回值:该全局函数信息的哈希值
func toString
public func toString(): String
功能:获取字符串形式的该全局函数信息。
返回值:字符串形式的该全局函数信息
operator func ==
public operator func ==(that: GlobalFunctionInfo): Bool
功能:判断该全局函数信息与给定的另一个全局函数信息是否相等。
参数:
that
: 被比较相等性的另一个全局函数信息
返回值:如果该全局函数信息与 that
相等则返回 true
,否则返回 false
operator func !=
public operator func !=(that: GlobalFunctionInfo): Bool
功能:判断该全局函数信息与给定的另一个全局函数信息是否不等。
参数:
that
: 被比较相等性的另一个全局函数信息
返回值:如果该全局函数信息与 that
不等则返回 true
,否则返回 false
class GlobalVariableInfo
public class GlobalVariableInfo <: Equatable<GlobalVariableInfo> & Hashable & ToString
全局变量信息。
prop name
public prop name: String
功能:获取该全局变量信息所对应的全局变量的名称。
prop typeInfo
public prop typeInfo: TypeInfo
功能:获取该全局变量信息所对应的全局变量的声明类型的类型信息。
func getValue
public func getValue(): Any
功能:获取该全局变量信息所对应的全局变量的值。
返回值:该全局变量的值
func setValue
public func setValue(newValue: Any): Unit
功能:设置该全局变量信息所对应的全局变量的值。
参数:
newValue
:新的值
异常:
- 如果该全局变量信息所对应的全局变量不可修改,则会抛出
IllegalSetException
异常 - 如果新值
newValue
的运行时类型不是全局变量信息所对应的全局变量的声明类型的子类型,则会抛出IllegalTypeException
异常
func hashCode
public func hashCode(): Int64
功能:获取该全局变量信息的哈希值。
返回值:该全局变量信息的哈希值
func toString
public func toString(): String
功能:获取字符串形式的该全局变量信息。
返回值:字符串形式的该全局变量信息
operator func ==
public operator func ==(that: GlobalVariableInfo): Bool
功能:判断该全局变量信息与给定的另一个全局变量信息是否相等。
参数:
that
: 被比较相等性的另一个全局变量信息
返回值:如果该全局变量信息与 that
相等则返回 true
,否则返回 false
operator func !=
public operator func !=(that: GlobalVariableInfo): Bool
功能:判断该全局变量信息与给定的另一个全局变量信息是否不等。
参数:
that
: 被比较相等性的另一个全局变量信息
返回值:如果该全局变量信息与 that
不等则返回 true
,否则返回 false
class ReflectException
public open class ReflectException <: Exception {
public init()
public init(message: String)
}
ReflectException
为 Reflect 包的基异常类。
init
public init()
功能:无参构造函数。
init
public init(message: String)
参数:
- message:异常信息
class InfoNotFoundException
public class InfoNotFoundException <: ReflectException {
public init()
public init(message: String)
}
InfoNotFoundException
为无法找到对应信息异常。
init
public init()
功能:无参构造函数。
init
public init(message: String)
参数:
- message:异常信息
class MisMatchException
public class MisMatchException <: ReflectException {
public init()
public init(message: String)
}
MisMatchException
为调用对应函数抛出异常。
init
public init()
功能:无参构造函数。
init
public init(message: String)
参数:
- message:异常信息
class IllegalSetException
public class IllegalSetException <: ReflectException {
public init()
public init(message: String)
}
IllegalSetException
为对不可变类型进行更改异常。
init
public init()
功能:无参构造函数。
init
public init(message: String)
参数:
- message:异常信息
class IllegalTypeException
public class IllegalTypeException <: ReflectException {
public init()
public init(message: String)
}
IllegalTypeException
为类型不匹配异常。
init
public init()
功能:无参构造函数。
init
public init(message: String)
参数:
- message:异常信息
class InvocationTargetException
public class InvocationTargetException <: ReflectException {
public init()
public init(message: String)
}
InvocationTargetException
为调用函数包装异常。
init
public init()
功能:无参构造函数。
init
public init(message: String)
参数:
- message:异常信息
示例
使用 TypeInfo 的例子
通过反射获取实例类型的类型名以及实例成员函数个数。
代码如下:
package Demo
from std import reflect.*
public class Foo {
public let item = 0
public func f() {}
}
main() {
let a = Foo()
let ty: TypeInfo = TypeInfo.of(a)
println(ty.name)
println(ty.qualifiedName)
println(ty.instanceFunctions.size)
}
运行结果如下:
Foo
Demo.Foo
1
使用成员信息的例子
通过反射动态获取实例类型参数名并进行动态设置。
代码如下:
from std import reflect.*
public class Rectangular {
public var length = 4
public var width = 5
public func area(): Int64 {
return length * width
}
}
main(): Unit {
let a = Rectangular()
let ty = TypeInfo.of(a)
const zl = 3
let members = ty.instanceVariables.toArray()
println((members[0].getValue(a) as Int64).getOrThrow())
println((members[1].getValue(a) as Int64).getOrThrow())
members[0].setValue(a, zl)
members[1].setValue(a, zl)
println((members[0].getValue(a) as Int64).getOrThrow())
println((members[1].getValue(a) as Int64).getOrThrow())
println(a.area())
let funcs = ty.instanceFunctions.toArray()
if (funcs[0].returnType.name == "Int64"){
println("The area of the square is ${zl**2}")
}
return
}
运行结果如下:
4
5
3
3
9
The area of the square is 9
动态加载的例子
在项目根目录 myProject
下分别创建两个目录 myModuleDirectory
和 myExecutableDirectory
,分别在其中使用 cjpm
构建仓颉动态库模块和可执行文件,该可执行文件将在动态加载该仓颉动态库模块后通过反射对动态库模块中的全局变量进行操作。
$ mkdir -p myProject && cd myProject
$ mkdir -p myModuleDirectory && cd myModuleDirectory
# 在 myModuleDirectory 目录下执行该命令初始化该仓颉动态库模块的目录结构,如此创建了一个名称为 myModule 的仓颉动态库模块。
$ cjpm init myOrganization myModule --type=dynamic
cjpm init success
$ mkdir -p src/myPackage/mySubPackage
$ cat << EOF > src/myPackage/mySubPackage/myImplementation.cj
package myPackage.mySubPackage
public var myPublicGlobalVariable0: Int64 = 2333
public let myPublicGlobalVariable1 = MyPublicType("Initializing myPublicGlobalVariable1 in myModule/myPackage.mySubPackage")
public class MyPublicType {
public MyPublicType(message: String) {
println(message)
}
public static func myPublicStaticMemeberFunction() {
println("myModule/myPackage.mySubPackage.MyPublicType.myPublicStaticMemeberFunction is called.")
}
static let myStaticVariable = MyPublicType("Initializing myStaticle in myModule/myPackage.mySubPackage.MyPublicType")
}
EOF
# 使用 cjpm 构建该仓颉动态库模块。
$ cjpm build
cjpm build success
$ cd .. && mkdir -p myExecutableDirectory && cd myExecutableDirectory
$ cjpm init myOrganization myExecutable
$ cat << EOF > src/main.cj
from std import reflect.*
main(): Unit {
// 加载仓颉动态库。
let myModule = ModuleInfo.load("../myModuleDirectory/build/release/myModule/libmyModule_myPackage.mySubPackage.so")
println(myModule.name)
let mySubPackage = myModule.findPackageInfo("myPackage.mySubPackage").getOrThrow()
println(mySubPackage.name)
TypeInfo.find("myModule/myPackage.mySubPackage.MyPublicType") |> println
let myPublicGlobalVariable0 = mySubPackage.getVariable("myPublicGlobalVariable0").getOrThrow()
(myPublicGlobalVariable0.getValue() as Int64).getOrThrow() |> println
myPublicGlobalVariable0.setValue(666)
(myPublicGlobalVariable0.getValue() as Int64).getOrThrow() |> println
}
EOF
# 构建并运行可执行程序。
$ cjpm run
Initializing myPublicGlobalVariable1 in myModule/myPackage.mySubPackage
Initializing myStaticVariable in myModule/myPackage.mySubPackage.MyPublicType
myModule
mySubPackage
myModule/myPackage.mySubPackage.MyPublicType
2333
666
cjpm run finished
$ tree ..
..
├── myExecutableDirectory
│ ├── build
│ │ └── release
│ │ ├── bin
│ │ │ ├── default.bchir
│ │ │ ├── default.cjo
│ │ │ └── main
│ │ ├── myExecutable
│ │ │ └── incremental-cache.json
│ │ └── myExecutable-cache.json
│ ├── module.json
│ ├── module-lock.json
│ └── src
│ └── main.cj
└── myModuleDirectory
├── build
│ └── release
│ ├── bin
│ ├── myModule
│ │ ├── incremental-cache.json
│ │ ├── libmyModule_myPackage.mySubPackage.so
│ │ ├── myPackage.mySubPackage.bchir
│ │ └── myPackage.mySubPackage.cjo
│ └── myModule-cache.json
├── module.json
├── module-lock.json
└── src
└── myPackage
└── mySubPackage
└── myImplementation.cj
14 directories, 16 files
注意,由于当前 ModuleInfo.load
函数根据文件名来判断包名,因此不允许修改该文件名,否则将抛出无法找到仓颉动态库模块文件的异常。
使用注解的例子
通过反射获取实例上注解的值。
代码如下:
from std import reflect.*
main() {
let ti = TypeInfo.of(Test())
let annotation = ti.findAnnotation<A>().getOrThrow()
match (annotation) {
case annotation: A => println(annotation.name)
case _ => println("annotation not found")
}
}
@A["Annotation"]
public class Test {}
@Annotation
public class A {
const A(let name: String) {}
}
运行结果如下:
Annotation
S