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 的子类包括 PrimitiveTypeInfoStructTypeInfoClassTypeInfoInterfaceTypeInfo,分别对应基本数据类型,struct 数据类型,class 数据类型和 interface 数据类型的类型信息。

func of

public static func of<T>(): TypeInfo

功能:获取给定类型对应的类型信息。

泛型:

  • T:将被获取其类型信息的任意类型。

返回值:T 类型对应的类型信息

异常:

  • 如果无法获得类型 T 所对应的类型信息,则会抛出 InfoNotFoundException 异常

注意:

  • 目前,T 不支持 Nothing 类型、函数类型,元组类型,enum 类型和带有泛型的 struct 类型。
  • T 支持传入类型别名,包括内置类型别名(如 IntUIntRune 等)与用户自定义类型别名。

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 类型信息。

参数:

  • aclass 类型的实例

返回值: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>

功能:获取该类型信息所对应的类型所拥有的所有公开实例成员函数的信息所组成的集合。

注意:

  • 如果该类型信息所对应的类型无任何公开实例成员函数,则返回空集合。
  • 该集合不保证遍历顺序恒定。
  • 如果该类型信息所对应的类型是 structclass 类型,则该集合包含从其他 interface 类型继承而来的非抽象的实例成员函数的信息。

prop staticFunctions

public prop staticFunctions: Collection<StaticFunctionInfo>

功能:获取该类型信息所对应的类型所拥有的所有公开静态成员函数的信息所组成的集合。

注意:

  • 如果该类型信息所对应的类型无任何公开静态成员函数,则返回空集合。
  • 该集合不保证遍历顺序恒定。
  • 如果该类型信息所对应的类型是 structclassinterface 类型,则该集合包含从其他 interface 类型继承而来的非抽象的静态成员函数的信息。

prop instanceProperties

public prop instanceProperties: Collection<InstancePropertyInfo>

功能:获取该类型信息所对应的类型所拥有的所有公开实例成员属性的信息所组成的集合。

注意:

  • 如果该类型信息所对应的类型无任何公开实例成员属性,则返回空集合。
  • 该集合不保证遍历顺序恒定。
  • 如果该类型信息所对应的类型是 structclass 类型,则该集合包含从其他 interface 类型继承而来的非抽象的实例成员属性的信息。

prop staticProperties

public prop staticProperties: Collection<StaticPropertyInfo>

功能:获取该类型信息所对应的类型所拥有的所有公开静态成员属性的信息所组成的集合。

注意:

  • 如果该类型信息所对应的类型无任何公开静态成员属性,则返回空集合。
  • 该集合不保证遍历顺序恒定。
  • 如果该类型信息所对应的类型是 structclassinterface 类型,则该集合包含从其他 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),整形类型(Int8Int16Int32Int64IntNativeUInt8UInt16UInt32UInt64UIntNative)和浮点类型(Float16Float32Float64)。

注意:

  • 目前尚不支持 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/am/a.bm/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 下分别创建两个目录 myModuleDirectorymyExecutableDirectory,分别在其中使用 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