PB语言实现反射机制
PowerReflect
PowerReflect是一个实现PB语言反射功能的PBNI项目。使用这个项目便能够在运行时获取PB中类的信息、类的属性和方法,动态修改对象的属性,动态调用对象的方法。
1、项目构成
本项目包含的类及相应功能说明如下:
类名 | 功能 |
---|---|
PBReflector | 反射器,用于访问项目的库、类、函数、对象等信息 |
PBLibrary | 库对象,用于访问PBL或PBD内部的类和方法 |
PBClass | 类对象,用于访问类的信息、类的属性和方法 |
PBField | 属性对象,用于访问类的属性或全局变量、共享变量 |
PBMethod | 方法对象,用于访问类的方法或全局函数、系统函数 |
PBEnum | 枚举对象,用于访问内置的枚举类型信息 |
2、项目依赖
本项目无依赖,只需在PB10及以上项目中导入PowerReflect.dll即可使用。
3、功能概要
3.1 PBReflector
PBReflector为反射器,主要实现以下功能:
-
获取项目的PBL或指定的PBL
-
获取类、函数、全局变量、枚举类型
-
获取对象的类、内嵌对象、属性、方法、事件
PBReflector的方法列表及说明如下:
方法名 | 参数列表 | 说明 |
---|---|---|
get_libraries | ref PBLibrary[] | 获取当前项目的所有库 |
get_library | string | 按名称获取库 |
get_class | string | 按名称获取类 |
get_function | string | 按名称获取全局函数 |
get_system_function | string | 按名称获取系统函数 |
get_system_function | string, string | 按名称和签名获取系统函数 |
get_global_vars | ref PBField[] | 获取当前项目所有全局变量 |
get_global_var | string | 按名称获取全局变量 |
get_enum | string | 按名称获取枚举对象 |
get_class | PowerObject | 获取对象的类 |
is_instance | PowerObject, PBClass | 判断是对象是否是类的实例 |
get_nested_objects | PowerObject, ref PowerObject[] | 获取对象的所有内嵌对象 |
get_nested_object | PowerObject, string | 按名称获取对象的内嵌对象 |
get_fields | ref PowerObject, ref PBField[] | 获取对象的所有属性 |
get_field | ref PowerObject, string | 按名称获取对象的属性 |
get_methods | PowerObject, ref PBMethod[] | 获取对象的所有方法 |
get_methods | PowerObject, string, PBMethod[] | 按名称获取对象的方法 |
get_method | PowerObject, string | 按名称获取对象的一个方法 |
get_method | PowerObject, string, string | 按名称和签名获取对象的方法 |
get_method | PowerObject, string, string[] | 按名称和参数列表获取对象的方法 |
get_events | PowerObject, PBMethod[] | 获取对象的所有事件 |
get_event | PowerObject, string | 按名称获取对象的事件 |
3.2 PBLibrary
PBLibrary为描述PBL或PBD的类,主要实现以下功能:
-
获取该PBL或PBD下所有的UserObject、Structure、Window、Menu类
-
获取该PBL或PBD下所有的全局函数
PBLibrary的方法列表及说明如下:
方法名 | 参数列表 | 说明 |
---|---|---|
get_name | 获取库的名称 | |
get_userobjects | ref PBClass[] | 获取当前库内的所有UserObjects |
get_structures | ref PBClass[] | 获取当前库内的所有结构体 |
get_functions | ref PBMethod[] | 获取当前库内的所有全局函数 |
get_windows | ref PBClass[] | 获取当前库内的所有窗口 |
get_menus | ref PBClass[] | 获取当前库内的所有菜单 |
3.3 PBClass
PBClass为描述PB中类的类,主要实现以下功能:
-
获取该类的基本信息
-
获取该类的超类、内嵌类、属性、方法、事件、共享变量
PBClass的方法列表及说明如下:
方法名 | 参数列表 | 说明 |
---|---|---|
get_name | 获取类的名称 | |
equals | 判定类是否相等 | |
get_superclass | 获取超类 | |
is_superclass_of | PBClass | 判定是否为超类 |
is_subclass_of | PBClass | 判定是否为子类 |
is_structure | 判定是否为结构体 | |
is_visual_type | 判定是否为可视类 | |
is_nested_class | 判定是否为内嵌类 | |
create_object | 创建对象 | |
get_nested_class_count | 获取内嵌类数量 | |
get_nested_classes | ref PBClass[] | 获取所有内嵌类 |
get_nested_classes | string, ref PBClass[] | 按名称获取内嵌类列表 |
get_nested_class | string | 按名称获取内嵌类 |
get_parent_class | 获取容器类 | |
get_field_count | 获取属性数量 | |
get_fields | ref PBField[] | 获取所有属性 |
get_field | string | 按名称获取属性 |
get_method_count | 获取方法数量 | |
get_methods | ref PBMethod[] | 获取所有方法 |
get_methods | string, ref PBMethod[] | 按名称获取方法列表 |
get_method | string | 按名称获取方法 |
get_method | string, string | 按名称和签名获取方法 |
get_method | string, string[] | 按名称和参数列表获取方法 |
get_event_count | 获取事件数量 | |
get_events | ref PBMethod[] | 获取所有事件 |
get_event | string | 按名称获取事件 |
get_shared_var_count | 获取共享变量数量 | |
get_shared_vars | ref PBField[] | 获取所有共享变量 |
get_shared_var | string | 按名称获取共享变量 |
3.4 PBField
PBField为描述PB中属性(包括全局变量、实例变量、共享变量)的类,主要实现以下功能:
-
获取该属性的基本信息
-
获取和修改属性的值
PBField的方法列表及说明如下:
方法名 | 参数列表 | 说明 |
---|---|---|
get_name | 获取属性名称 | |
get_read_access | 获取读权限 | |
get_write_access | 获取写权限 | |
get_kind | 获取属性类型 | |
is_null | 判定属性是否为空值 | |
is_array | 判定属性是否为数组 | |
get_category | 获取属性类型分类 | |
get_class | 获取属性类型 | |
get_type | 获取属性系统类型名称 | |
set_object | PowerObject | 为类属性设置对象 |
get_value | 获取属性的值 | |
set_value | any | 设置属性的值 |
set_null | 设置属性为空值 | |
update_value | any | 更新可视属性的值 |
3.5 PBMethod
PBMethod为描述PB中方法(包括全局函数、系统函数、类的方法和事件)的类,主要实现以下功能:
-
获取该方法的基本信息
-
获取该方法的参数和返回值信息
-
调用该方法
PBMethod的方法列表及说明如下:
方法名 | 参数列表 | 说明 |
---|---|---|
get_name | 获取方法名称 | |
get_access | 获取调用权限 | |
get_kind | 获取方法分类 | |
get_arg_count | 获取参数数量 | |
has_list_arg | 判定是否有列表参数 | |
get_arg_name | int | 获取参数名 |
get_arg_id | string | 获取参数位置 |
is_arg_null | int | 判定参数是否为控制 |
is_arg_array | int | 判定参数是否为数组 |
get_arg_category | int | 获取参数类型分类 |
get_arg_convention | int | 获取参数传递方式 |
get_arg_class | int | 获取参数类型 |
get_arg_type | int | 获取参数系统类型名称 |
has_return_value | 判定是否有返回值 | |
get_return_category | 获取返回值类型分类 | |
get_return_class | 获取返回值类型 | |
get_return_type | 获取返回值系统类型名称 | |
set_object | PowerObject | 为方法或事件设置对象 |
get_arg_value | int | 获取参数值 |
invoke | 无参调用方法 | |
invoke | any, ... | 传参调用方法 |
invoke_with_args_array | ref any[] | 使用数组参数调用方法 |
invoke_with_args_object | ref PowerObject | 使用对象参数调用方法 |
3.6 PBEnum
PBEnum为描述PB内置枚举类型的类,主要实现以下功能:
-
获取该枚举类型的基本信息
-
获取枚举项的值或名称
PBEnum的方法列表及说明如下:
方法名 | 参数列表 | 说明 |
---|---|---|
get_name | 获取枚举名称 | |
get_item_count | 获取可枚举数量 | |
get_item_name | long | 获取枚举项目名称 |
get_item_value | string | 获取枚举项目值 |
4、快速入门
4.1 获取PBL中所有UserObject的名称
下面的例子在运行时读取 demo1.pbl 中所有UserObject的名称
pbreflector reflector
pblibrary pbl
pbclass uo[]
string uo_name[]
long ll_count, i
reflector = create pbreflector
pbl = reflector.get_library('demo1.pbl')
ll_count = pbl.get_userobjects(uo)
for i = 1 to ll_count
uo_name[i] = uo[i].get_name()
next
4.2 动态获取和修改全局变量的值
gs_test 为string类型的全局变量,程序通过变量名动态到获取这个全局变量的值,并修改它的值
pbreflector reflector
pbfield gvar
string ls_test
gs_test = 'abcd'
reflector = create pbreflector
gvar = reflector.get_global_var('gs_test')
ls_test = gvar.get_value()
gvar.set_value('1234')
4.3 动态调用全局函数
f_sum为自定义全局函数,传入两个int值,返回两数之和,程序动态获取到这个函数并传参调用
pbreflector reflector
pbmethod gfun
int li_result
reflector = create pbreflector
gfun = reflector.get_function('f_sum')
li_result = gfun.invoke(3, 5)
4.4 根据类名获取这个类所有属性和方法的名称
n_demo01为自定义类,下面的例子获取到这个类的所有属性和方法,并获取这些属性和方法的名称
pbreflector reflector
pbclass cls
pbfield fields[]
pbmethod methods[]
long ll_field_count, ll_method_count, i
string ls_field_names[], ls_method_names[]
reflector = create pbreflector
cls = reflector.get_class('n_demo01')
ll_field_count = cls.get_fields(fields)
for i = 1 to ll_field_count
ls_field_names[i] = fields[i].get_name()
next
ll_method_count = cls.get_methods(methods)
for i = 1 to ll_method_count
ls_method_names[i] = methods[i].get_name()
next
4.5 动态获取并修改对象的属性值
下面的例子获取到 demo01 这个对象的属性 var1,并获取和修改属性的值
pbreflector reflector
pbfield field
n_demo01 demo01
string ls
demo01 = create n_demo01
demo01.var1 = 'abcdefg'
reflector = create pbreflector
field = reflector.get_field(demo01, 'var1')
ls = field.get_value()
field.set_value('hijklmn')
4.6 动态获取并调用对象的方法
n_demo01 的 test_sum 方法接收两个int入参,返回两数之和。下面的例子动态获取到这个方法并传参调用。
pbreflector reflector
pbmethod method
n_demo01 demo01
int li_result
demo01 = create n_demo01
reflector = create pbreflector
method = reflector.get_method(demo01, 'test_sum')
li_result = method.invoke(3, 5)
5、详细使用说明
后文中所有代码,均省略以下内容:
pbreflector reflector
reflector = create pbreflector
5.1 PBReflector
5.1.1 get_libraries
获取当前运行项目的所有库对象(PBL或PBD)。
long get_libraries(ref PBLibrary libraries[])
参数与返回值 | 类型 | 描述 |
---|---|---|
libraries | ref PBLibrary[] | 当前项目的库对象数组 |
返回值 | long | 获取到的库对象数量 |
下面的例子获取当前运行项目的所有PBL对象:
pblibrary pbls[]
reflector.get_libraries(pbls)
5.1.2 get_library
按文件名获取指定的库对象。
PBLibrary get_library(string library_name)
参数与返回值 | 类型 | 描述 |
---|---|---|
library_name | string | 指定PBL或PBD的文件名 |
返回值 | PBLibrary | 获取到的库对象 |
下面的例子获取到名称为 demo01.pbl 的PBL对象:
pblibrary pbl_demo01
pbl_demo01 = reflector.get_library('demo01.pbl')
5.1.3 get_class
按类名获取类对象。
PBClass get_class(string class_name)
参数与返回值 | 类型 | 描述 |
---|---|---|
class_name | string | 要获取的类的名称 |
返回值 | PBClass | 获取到的类对象, 如果类不存在,返回null |
下面的例子获取到名称为 n_demo01 的类对象:
pbclass cls_demo01
cls_demo01 = reflector.get_class('n_demo01')
5.1.4 get_function
按函数名获取全局函数对象。
PBMethod get_function(string function_name)
参数与返回值 | 类型 | 描述 |
---|---|---|
function_name | string | 要获取的全局函数的名称 |
返回值 | PBMethod | 获取到的全局函数对象, 如果全局函数不存在,返回null |
下面的例子获取到名称为 f_demo01 的全局函数对象:
pbmethod m_f_demo01
m_f_demo01 = reflector.get_function('f_demo01')
5.1.5 get_system_function
按函数名获取系统函数对象。
PBMethod get_system_function(string function_name, {string signature})
参数与返回值 | 类型 | 描述 |
---|---|---|
function_name | string | 要获取的系统函数的名称 |
signature(可选) | string | 要获取的系统函数的参数描述 |
返回值 | PBMethod | 获取到的系统函数对象, 如果系统函数不存在,返回null |
下面的例子获取到名称为 messagebox,且参数为 (string, string) 的系统函数对象:
pbmethod m_messagebox
m_messagebox = reflector.get_system_function('messagebox', 'string, string')
5.1.6 get_global_vars
获取当前项目的所有全局变量对象。
long get_global_vars(ref PBField vars[])
参数与返回值 | 类型 | 描述 |
---|---|---|
vars | ref PBField[] | 获取到的所有全局变量对象数组 |
返回值 | long | 获取到的全局变量数量 |
下面的例子获取到项目所有的全局变量对象:
pbfield gvars[]
reflector.get_global_vars(gvars)
5.1.7 get_global_var
按变量名获取全局变量对象。
PBField get_global_var(string var_name)
参数与返回值 | 类型 | 描述 |
---|---|---|
var_name | string | 全局变量名 |
返回值 | PBField | 获取到的全局变量对象, 如果全局变量不存在,返回null |
下面的例子获取到名称为 gs_demo01 的全局变量对象:
pbfield gvar_s_demo01
gvar_s_demo01 = reflector.get_global_var('gs_demo01')
5.1.8 get_enum
按名称获取PB内置的枚举类型对象。
PBEnum get_enum(string enum_name)
参数与返回值 | 类型 | 描述 |
---|---|---|
enum_name | string | 枚举类型名称 |
返回值 | PBEnum | 获取到的枚举类型对象, 如果枚举类型不存在,返回null |
下面的例子获取到名称为 icon 的枚举类型对象:
pbenum enum_icon
enum_icon = reflector.get_enum('icon')
5.1.9 get_class
获取传入对象的类对象。
PBClass get_class(PowerObject po)
参数与返回值 | 类型 | 描述 |
---|---|---|
po | PowerObject | 任意对象 |
返回值 | PBClass | 传入对象的类对象 |
下面的例子获取当前按钮对象的类对象:
pbclass cls_cb
cls_cb = reflector.get_class(this)
5.1.10 is_instance
判定对象是否是类的实例。
boolean is_instance(powerobject po, PBClass c)
参数与返回值 | 类型 | 描述 |
---|---|---|
po | PowerObject | 任意对象 |
c | PBClass | 类对象 |
返回值 | boolean | 传入对象是否为类的实例 |
下面的例子判定当前按钮是否是 commandbutton 的实例:
boolean b
pbclass cls_cb
cls_cb = reflector.get_class('commandbutton')
b = reflector.is_instance(this, cls_cb)
5.1.11 get_nested_objects
获取对象的所有内嵌对象。
long get_nested_objects(powerobject po, ref powerobject objects[])
参数与返回值 | 类型 | 描述 |
---|---|---|
po | PowerObject | 任意对象 |
objects | ref PowerObject[] | 内嵌对象数组 |
返回值 | long | 内嵌对象的数量 |
下面的例子获取当前窗口的所有内嵌对象:
powerobject nested_objects[]
reflector.get_nested_objects(parent, nested_objects)
5.1.12 get_nested_object
按名称获取对象指定的内嵌对象。
powerobject get_nested_object(powerobject po, string object_name)
参数与返回值 | 类型 | 描述 |
---|---|---|
po | PowerObject | 任意对象 |
object_name | string | 内嵌对象的名称 |
返回值 | PowerObject | 获取到的内嵌对象, 若内嵌对象不存在,返回null |
下面的例子获取当前窗口中名称为 cb_demo 的内嵌对象:
powerobject nested_object
nested_object = reflector.get_nested_object(parent, 'cb_demo')
5.1.13 get_fields
获取对象的所有实例属性对象。
long get_fields(ref powerobject po, ref PBField fields[])
参数与返回值 | 类型 | 描述 |
---|---|---|
po | ref PowerObject | 任意对象 |
fields | ref PBField[] | 获取到的属性对象 |
返回值 | long | 获取到属性对象的数量 |
下面的例子创建了 n_demo 类的实例,并获取这个实例的所有属性对象:
pbfield fields[]
n_demo d
d = create n_demo
reflector.get_fields(d, fields)
5.1.14 get_field
按名称获取对象的实例属性对象。
PBField get_field(ref powerobject po, string field_name)
参数与返回值 | 类型 | 描述 |
---|---|---|
po | ref PowerObject | 任意对象 |
field_name | string | 实例属性名称 |
返回值 | PBField | 获取到的实例属性, 若属性不存在,返回null |
下面的例子创建了 n_demo 类的实例,并获取这个实例中名称为 is_demo 的属性对象:
pbfield field_demo
n_demo d
d = create n_demo
field_demo = reflector.get_field(d, 'is_demo')
5.1.15 get_methods
获取对象的所有方法对象。
long get_methods(powerobject po, {string method_name}, ref PBMethod methods[])
参数与返回值 | 类型 | 描述 |
---|---|---|
po | ref PowerObject | 任意对象 |
method_name(可选) | string | 方法名称 |
methods | ref PBMethod[] | 获取到的方法对象数组 |
返回值 | long | 获取到的方法对象数量 |
下面的例子获取当前窗口的所有方法对象:
pbmethod methods[]
reflector.get_methods(parent, methods)
5.1.16 get_method
获取对象中指定的方法对象。
PBMethod get_method(powerobject po, string method_name, {string signature})
PBMethod get_method(powerobject po, string method_name, {string argument_list[]})
参数与返回值 | 类型 | 描述 |
---|---|---|
po | ref PowerObject | 任意对象 |
method_name | string | 方法名称 |
signature(可选) | string | 方法参数描述 |
argument_list(可选) | string[] | 方法参数描述数组 |
返回值 | PBMethod | 获取到的符合条件的方法, 若无符合条件的方法,返回null |
下面的例子获取当前窗口名称为 wf_demo ,参数列表为 (string, int) 的方法:
pbmethod method_demo
method_demo = reflector.get_method(parent, 'wf_demo', 'string, int')
5.1.17 get_events
获取对象的所有事件对象。
long get_events(powerobject po, ref PBMethod events[])
参数与返回值 | 类型 | 描述 |
---|---|---|
po | ref PowerObject | 任意对象 |
events | ref PBMethod[] | 获取到的事件对象数组 |
返回值 | long | 获取到的事件对象数量 |
下面的例子获取当前窗口的所有事件对象:
pbmethod events[]
reflector.get_events(parent, events)
5.1.18 get_event
按事件名称获取对象的事件对象。
PBMethod get_event(powerobject po, string event_name)
参数与返回值 | 类型 | 描述 |
---|---|---|
po | ref PowerObject | 任意对象 |
event_name | string | 事件名称 |
返回值 | PBMethod | 获取到的事件对象, 若事件不存在,返回null |
下面的例子获取当前窗口的 open 事件对象:
pbmethod event_open
event_open = reflector.get_event(parent, 'open')
5.2 PBLibrary
本节中所有代码,均省略以下获取 demo.pbl 库对象的内容:
pblibrary pbl_demo
pbl_demo = reflector.get_library('demo.pbl')
5.2.1 get_name
获取当前库对象的名称。
string get_name()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | string | 当前库对象的名称 |
下面的例子获取当前库对象的名称:
string name
name = pbl_demo.get_name()
5.2.2 get_userobjects
获取当前库对象中所有UserObject的类对象。
long get_userobjects(ref PBClass classes[])
参数与返回值 | 类型 | 描述 |
---|---|---|
classes | ref PBClass[] | 获取到的UserObject类对象数组 |
返回值 | long | 获取到的UserObject数量 |
下面的例子获取 demo.pbl 中所有的UserObject类对象:
pbclass cls_uo[]
pbl_demo.get_userobjects(cls_uo)
5.2.3 get_structures
获取当前库对象中所有Structure的类对象。
long get_structures(ref PBClass structures[])
参数与返回值 | 类型 | 描述 |
---|---|---|
structures | ref PBClass[] | 获取到的Structure类对象数组 |
返回值 | long | 获取到的Structure数量 |
下面的例子获取 demo.pbl 中所有的Structure类对象:
pbclass cls_st[]
pbl_demo.get_structures(cls_st)
5.2.4 get_functions
获取当前库对象中所有全局函数对象。
long get_functions(ref PBMethod methods[])
参数与返回值 | 类型 | 描述 |
---|---|---|
methods | ref PBMethod[] | 获取到的全局函数对象数组 |
返回值 | long | 获取到的全局函数数量 |
下面的例子获取 demo.pbl 中所有的全局函数对象:
PBMethod m_gf[]
pbl_demo.get_functions(m_gf)
5.2.5 get_windows
获取当前库对象中所有Window的类对象。
long get_windows(ref PBClass windows[])
参数与返回值 | 类型 | 描述 |
---|---|---|
windows | ref PBClass[] | 获取到的Window类对象数组 |
返回值 | long | 获取到的Window数量 |
下面的例子获取 demo.pbl 中所有的Window类对象:
PBClass cls_window[]
pbl_demo.get_windows(cls_window)
5.2.6 get_menus
获取当前库对象中所有Menu的类对象。
long get_menus(ref PBClass menus[])
参数与返回值 | 类型 | 描述 |
---|---|---|
menus | ref PBClass[] | 获取到的Menu类对象数组 |
返回值 | long | 获取到的Menu数量 |
下面的例子获取 demo.pbl 中所有的Menu类对象:
PBClass cls_menu[]
pbl_demo.get_menus(cls_menu)
5.3 PBClass
本节中所有代码,均省略以下获取 n_demo 类对象的内容:
pbclass cls_demo
cls_demo = reflector.get_class('n_demo')
5.3.1 get_name
获取当前类的名称。
string get_name()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | string | 当前类的名称 |
下面的例子获取当前类的名称:
string name
name = cls_demo.get_name()
5.3.2 equals
判定类是否一致。
boolean equals(PBClass cls)
参数与返回值 | 类型 | 描述 |
---|---|---|
cls | PBClass | 需要比较的类 |
返回值 | string | 当前类与传入的类是否一致 |
下面的例子判断当前类是否是 n_demo :
boolean b
b = cls_demo.equals(reflector.get_class('n_demo'))
5.3.3 get_superclass
获取当前类的超类。
PBClass get_superclass()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | PBClass | 当前类的超类, 若超类不存在,返回null |
下面的例子获取当前类的超类:
PBClass cls_super
cls_super = cls_demo.get_superclass()
5.3.4 is_superclass_of
判断当前类是否为传入类的超类。
boolean is_superclass_of(PBClass cls)
参数与返回值 | 类型 | 描述 |
---|---|---|
cls | PBClass | 任意类对象 |
返回值 | boolean | 当前类是否为传入类的超类 |
下面的例子判断当前类是否为 n_demo01 的超类:
boolean b
b = cls_demo.is_superclass_of(reflector.get_class('n_demo01'))
5.3.5 is_subclass_of
判断当前类是否为传入类的子类。
boolean is_subclass_of(PBClass cls)
参数与返回值 | 类型 | 描述 |
---|---|---|
cls | PBClass | 任意类对象 |
返回值 | boolean | 当前类是否为传入类的子类 |
下面的例子判断当前类是否为 n_demo01 的子类:
boolean b
b = cls_demo.is_subclass_of(reflector.get_class('n_demo01'))
5.3.6 is_structure
判断当前类是否为Structure。
boolean is_structure()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | boolean | 当前类是否为Structure |
下面的例子判断当前类是否为Structure:
boolean b
b = cls_demo.is_structure()
5.3.7 is_visual_type
判断当前类是否为可视类型。
boolean is_visual_type()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | boolean | 当前类是否为可视类型 |
下面的例子判断当前类是否为可视类型:
boolean b
b = cls_demo.is_visual_type()
5.3.8 is_nested_class
判断当前类是否为内嵌类型。
boolean is_nested_class()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | boolean | 当前类是否为内嵌类型 |
下面的例子判断当前类是否为内嵌类型:
boolean b
b = cls_demo.is_nested_class()
5.3.9 create_object
创建一个当前类型的实例。
注:内嵌类型或可视类型无法通过这种方式创建实例
powerobject create_object()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | PowerObject | 创建的实例 |
下面的例子为当前类型创造一个实例:
powerobject obj
obj = cls_demo.create_object()
5.3.10 get_nested_class_count
获取当前类型的内嵌类数量。
long get_nested_class_count()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | long | 内嵌类数量 |
下面的例子获取当前类型内嵌类的数量:
long count
count = cls_demo.get_nested_class_count()
5.3.11 get_nested_classes
获取当前类型的所有内嵌类。
long get_nested_classes({string class_name}, ref PBClass classes[])
参数与返回值 | 类型 | 描述 |
---|---|---|
class_name | string | 内嵌类名称 |
classes | ref PBClass[] | 获取到的内嵌类数组 |
返回值 | long | 获取到的内嵌类数量 |
下面的例子获取当前类型的所有内嵌类:
pbclass nested_cls[]
cls_demo.get_nested_classes(nested_cls)
5.3.12 get_nested_class
按名称获取当前类型的内嵌类。
PBClass get_nested_class(string class_name)
参数与返回值 | 类型 | 描述 |
---|---|---|
class_name | string | 内嵌类的名称 |
返回值 | PBClass | 获取到的内嵌类, 若内嵌类不存在,返回null |
下面的例子获取当前类型中名称为 n_demo_inner 的内嵌类:
pbclass cls_inner
cls_inner = cls_demo.get_nested_class('n_demo_inner')
5.3.13 get_parent_class
获取当前内嵌类外部的容器类。
PBClass get_parent_class()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | PBClass | 获取到的外部容器类, 若当前类不是内嵌类,返回null |
下面的例子获取当前内嵌类外部的容器类:
pbclass cls_parent
cls_parent = cls_demo.get_parent_class()
5.3.14 get_field_count
获取当前类型实例属性的数量。
long get_field_count()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | long | 当前类型实例属性的数量 |
下面的例子获取当前类型实例属性的数量:
long count
count = cls_demo.get_field_count()
5.3.15 get_fields
获取当前类型的所有实例属性。
long get_fields(ref PBField fields[])
参数与返回值 | 类型 | 描述 |
---|---|---|
fields | ref PBField[] | 当前类型的所有实例属性 |
返回值 | long | 当前类型实例属性的数量 |
下面的例子获取当前类型的所有实例属性:
pbfield fields[]
cls_demo.get_fields(fields)
5.3.16 get_field
按属性名称获取当前类型的实例属性。
PBField get_field(string field_name)
参数与返回值 | 类型 | 描述 |
---|---|---|
field_name | string | 属性名称 |
返回值 | PBField | 获取到的实例属性对象, 若属性不存在,返回null |
下面的例子获取当前类型中名称为 is_demo 的实例属性:
pbfield field_demo
field_demo = cls_demo.get_field('is_demo')
5.3.17 get_method_count
获取当前类型的方法数量。
long get_method_count()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | long | 当前类型的方法数量 |
下面的例子获取当前类型的方法数量:
long count
count = cls_demo.get_method_count()
5.3.18 get_methods
获取当前类型的所有方法。
long get_methods({string method_name}, ref PBMethod methods[])
参数与返回值 | 类型 | 描述 |
---|---|---|
method_name(可选) | string | 方法名称 |
methods | ref PBMethod[] | 获取到的当前类型的所有方法 |
返回值 | long | 获取到的方法数量 |
下面的例子获取当前类型的所有名称为 of_demo 的方法:
pbmethod methods_demo[]
cls_demo.get_methods('of_demo', methods_demo)
5.3.19 get_method
获取当前类符合条件的方法。
PBMethod get_method(string method_name, {string signature})
PBMethod get_method(string method_name, {string argument_list[]})
参数与返回值 | 类型 | 描述 |
---|---|---|
method_name | string | 方法名称 |
signature(可选) | string | 参数列表 |
argument_list(可选) | string[] | 参数列表数组 |
返回值 | PBMethod | 获取到的方法对象, 若方法不存在,返回null |
下面的例子获取当前类型中名称为 of_demo ,并且参数列表为 (long, string) 的方法:
pbmethod method_demo
method_demo = cls_demo.get_method('of_demo', 'long, string')
5.3.20 get_event_count
获取当前类型的事件数量。
long get_event_count()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | long | 当前类型的事件数量 |
下面的例子获取当前类型的事件数量:
long count
count = cls_demo.get_event_count()
5.3.21 get_events
获取当前类型的所有事件。
long get_events(ref PBMethod events[])
参数与返回值 | 类型 | 描述 |
---|---|---|
events | ref PBMethod[] | 当前类型的所有事件 |
返回值 | long | 当前类型事件的数量 |
下面的例子获取当前类型的所有事件:
PBMethod events[]
cls_demo.get_events(events)
5.3.22 get_event
按事件名称获取当前类型的事件。
PBMethod get_event(string event_name)
参数与返回值 | 类型 | 描述 |
---|---|---|
event_name | string | 事件名称 |
返回值 | PBMethod | 获取到的事件对象, 若事件不存在,返回null |
下面的例子获取当前类型中名称为 eve_demo 的事件:
pbmethod method_demo
method_demo = cls_demo.get_event('eve_demo')
5.3.23 get_shared_var_count
获取当前类型的共享属性数量。
long get_shared_var_count()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | long | 当前类型的共享属性数量 |
下面的例子获取当前类型的共享属性数量:
long count
count = cls_demo.get_shared_var_count()
5.3.24 get_shared_vars
获取当前类型的所有共享属性。
long get_shared_vars(ref PBField vars[])
参数与返回值 | 类型 | 描述 |
---|---|---|
vars | ref PBField[] | 当前类型的所有共享属性 |
返回值 | long | 当前类型共享属性的数量 |
下面的例子获取当前类型的所有共享属性:
PBField shared_vars[]
cls_demo.get_shared_vars(shared_vars)
5.3.25 get_shared_var
按属性名称获取当前类型的共享属性。
PBField get_shared_var(string var_name)
参数与返回值 | 类型 | 描述 |
---|---|---|
var_name | string | 共享属性名称 |
返回值 | PBField | 获取到的共享属性对象, 若共享属性不存在,返回null |
下面的例子获取当前类型中名称为 ss_demo 的共享属性:
pbfield shared_var
shared_var = cls_demo.get_shared_var('ss_demo')
5.4 PBField
本节中所有代码,均省略以下获取 n_demo 类中 is_demo 实例属性对象的内容:
pbclass cls_demo
pbfield field
cls_demo = reflector.get_class('n_demo')
field = cls_demo.get_field('is_demo')
5.4.1 get_name
获取当前属性的名称。
string get_name()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | string | 当前属性的名称 |
下面的例子获取当前属性的名称:
string name
name = field.get_name()
5.4.2 get_read_access、get_write_access
获取当前属性的读、写权限。
VarAccess get_read_access()
VarAccess get_write_access()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | VarAccess | 当前属性的读或写权限 |
下面的例子获取当前属性的读和写的权限:
varaccess read_access, write_access
read_access = field.get_read_access()
write_access = field.get_write_access()
5.4.3 get_kind
获取当前属性的类型(全局变量、实例变量或共享变量)。
VariableKind get_kind()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | VariableKind | 当前属性的类型 |
下面的例子获取当前属性的类型:
variablekind kind
kind = field.get_kind()
5.4.4 is_null
判断当前属性值是否为null。
注:属性为实例变量时,需要设置具体对象后才能调用该方法
boolean is_null()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | boolean | 当前属性值是否为null |
下面的例子为当前属性设置对象后,判断对象的该属性是否为null:
n_demo d
boolean b
d = create demo
field.set_object(d)
b = field.is_null()
5.4.5 is_array
判定当前属性是否定义为数组。
boolean is_array()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | boolean | 当前属性是否定义为数组 |
下面的例子判定当前属性是否定义为数组:
boolean b
b = field.is_array()
5.4.6 get_category
获取当前属性定义类型的分类。
TypeCategory get_category()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | TypeCategory | 当前属性定义类型的分类 |
下面的例子获取当前属性定义类型的分类:
TypeCategory category
category = field.get_category()
5.4.7 get_class
获取当前属性定义的类型。
PBClass get_class()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | PBClass | 当前属性定义的类型, 若属性定义为基本类型或枚举类型,返回null |
下面的例子获取当前属性定义的类型:
PBClass cls
cls = field.get_class()
5.4.8 get_type
获取当前属性定义的类型名称。
string get_type()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | string | 当前属性定义的类型名称, 属性为基本类型或枚举类型时,返回对应的类型名称 |
下面的例子获取当前属性定义的类型名称:
string type_name
type_name = field.get_type()
5.4.9 set_object
为当前属性设置具体实例对象。
注:只有实例属性能调用该方法设置对象,全局变量和共享变量不能调用该方法
set_object(ref powerobject po)
参数与返回值 | 类型 | 描述 |
---|---|---|
po | ref PowerObject | 实例对象, 若设置的对象不是属性所属类的实例,将抛出异常 |
下面的例子为当前属性设置对象:
n_demo d
d = create demo
field.set_object(d)
5.4.10 get_value
获取当前属性的值。
注:实例属性必须先设置对象后才能调用该方法
any get_value()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | any | 当前属性的值 |
下面的例子获取当前属性的值并转为string类型:
string s_value
s_value = field.get_value()
5.4.11 set_value
设置当前属性的值。
注:实例属性必须先设置对象后才能调用该方法
set_value(any value)
参数与返回值 | 类型 | 描述 |
---|---|---|
value | any | 要设置的属性的值, 若类型不匹配,将抛出异常 |
下面的例子将当前属性的值设置为 'abcd' :
field.set_value('abcd')
5.4.12 set_null
设置当前属性的值为null。
注:实例属性必须先设置对象后才能调用该方法
set_null()
下面的例子将当前属性的值设置为null:
field.set_null()
5.4.13 update_value
设置当前属性的值,并刷新显示:
注:只有可视对象能够影响显示的属性值,才能使用此方法
update_value(any value)
参数与返回值 | 类型 | 描述 |
---|---|---|
value | any | 要设置的属性的值, 若类型不匹配,将抛出异常 |
下面的例子将当前窗口上 cb_demo 按钮上的文本改为 'abcd' :
pbfield field_text
field_text = reflector.get_field(cb_1, 'text')
field_text.update_value('abcd')
5.5 PBMethod
本节中所有代码,均省略以下获取 n_demo 类中 of_demo 方法的内容:
pbclass cls_demo
pbmethod method
cls_demo = reflector.get_class('n_demo')
method = cls_demo.get_method('of_demo')
5.5.1 get_name
获取当前方法的名称。
string get_name()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | string | 当前方法的名称 |
下面的例子获取当前方法的名称:
string name
name = method.get_name()
5.5.2 get_access
获取当前方法的访问权限。
VarAccess get_access()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | VarAccess | 当前方法的访问权限 |
下面的例子获取当前方法的访问权限:
varaccess access
access = method.get_access()
5.5.3 get_kind
获取当前方法的类型(方法、事件)。
ScriptKind get_kind()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | ScriptKind | 当前方法的类型 |
下面的例子获取当前方法的类型:
scriptkind kind
kind = method.get_kind()
5.5.4 get_arg_count
获取当前方法的参数个数。
int get_arg_count()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | int | 当前方法的参数个数 |
下面的例子获取当前方法的参数个数:
int arg_count
arg_count = method.get_arg_count()
5.5.5 has_list_arg
判定当前方法是否具有列表参数。
boolean has_list_arg()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | boolean | 当前方法是否具有列表参数 |
下面的例子判定当前方法是否具有列表参数:
boolean b
b = method.has_list_arg()
5.5.6 get_arg_name
获取第i个参数名称。
string get_arg_name(int i)
参数与返回值 | 类型 | 描述 |
---|---|---|
i | int | 参数位置,从1开始计算 |
返回值 | string | 参数名称 |
下面的例子获取当前方法第2个参数的名称:
string name
name = method.get_arg_name(2)
5.5.7 get_arg_id
获取参数的位置。
int get_arg_id(string name)
参数与返回值 | 类型 | 描述 |
---|---|---|
name | string | 参数名称 |
返回值 | int | 参数位置 |
下面的例子获取当前方法中参数 'as_name' 的位置:
int id
id = method.get_arg_id('as_name')
5.5.8 is_arg_null
判定第i个参数是否为null。
boolean is_arg_null(int i)
参数与返回值 | 类型 | 描述 |
---|---|---|
i | int | 参数位置,从1开始计算 |
返回值 | boolean | 对应参数否为null |
下面的例子判定当前方法第2个参数是否为null:
boolean b
b = method.is_arg_null(2)
5.5.9 is_arg_array
判定第i个参数是否定义为数组。
boolean is_arg_array(int i)
参数与返回值 | 类型 | 描述 |
---|---|---|
i | int | 参数位置,从1开始计算 |
返回值 | boolean | 对应参数否定义为数组 |
下面的例子判定当前方法第2个参数是否定义为数组:
boolean b
b = method.is_arg_array(2)
5.5.10 get_arg_category
获取第i个参数定义类型的分类。
TypeCategory get_arg_category(int i)
参数与返回值 | 类型 | 描述 |
---|---|---|
i | int | 参数位置,从1开始计算 |
返回值 | TypeCategory | 对应参数定义类型的分类 |
下面的例子获取当前方法第2个参数定义类型的分类:
typecategory category
category = method.get_arg_category(2)
5.5.11 get_arg_convention
获取第i个参数的传递方式(value、readonly、reference)。
ArgCallingConvention get_arg_convention(int i)
参数与返回值 | 类型 | 描述 |
---|---|---|
i | int | 参数位置,从1开始计算 |
返回值 | ArgCallingConvention | 对应参数的传递方式 |
下面的例子获取当前方法第2个参数的传递方式:
argcallingconvention convention
convention = method.get_arg_convention(2)
5.5.12 get_arg_class
获取第i个参数定义的类型。
PBClass get_arg_class(int i)
参数与返回值 | 类型 | 描述 |
---|---|---|
i | int | 参数位置,从1开始计算 |
返回值 | PBClass | 对应参数定义的类型, 若为基本类型或枚举类型,返回null |
下面的例子获取当前方法第2个参数定义的类型:
pbclass cls
cls = method.get_arg_class(2)
5.5.13 get_arg_type
获取第i个参数类型名称。
string get_arg_type(int i)
参数与返回值 | 类型 | 描述 |
---|---|---|
i | int | 参数位置,从1开始计算 |
返回值 | string | 对应参数类型名称 |
下面的例子获取当前方法第2个参数类型名称:
string type_name
type_name = method.get_arg_type(2)
5.5.14 has_return_value
判定当前方法是否有返回值。
boolean has_return_value()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | boolean | 当前方法是否有返回值 |
下面的例子判定当前方法是否有返回值:
boolean b
b = method.has_return_value()
5.5.15 get_return_category
获取当前方法返回值的分类。
TypeCategory get_return_category()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | TypeCategory | 返回值的分类, 若无返回值,返回null |
下面的例子获取当前方法返回值的分类:
typecategory category
category = method.get_return_category()
5.5.16 get_return_class
获取当前方法返回值定义的类型。
PBClass get_return_class()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | PBClass | 返回值定义的类型, 若无返回值,返回null 若为基本类型或枚举类型,返回null |
下面的例子获取当前方法返回值定义的类型:
pbclass cls
cls = method.get_return_class()
5.5.17 get_return_type
获取返回值类型名称。
string get_return_type()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | string | 返回值类型名称, 若无返回值,返回null |
下面的例子获取当前方法返回值类型名称:
string type_name
type_name = method.get_return_type()
5.5.18 set_object
为当前方法或事件设置对象。
注:对象方法和事件可调用该方法,全局函数和系统函数不能调用该方法
set_object(ref powerobject po)
参数与返回值 | 类型 | 描述 |
---|---|---|
po | ref PowerObject | 要设置的对象, 若对象不是方法所属类的实例,将抛出异常 |
下面的例子为当前方法设置了一个对象:
n_demo d
d = create n_demo
method.set_object(d)
5.5.19 get_arg_value
获取第i个参数的值。
注:包含ref参数的方法调用后,可使用该方法取参数值
any get_arg_value(int i)
参数与返回值 | 类型 | 描述 |
---|---|---|
i | int | 参数位置,从1开始计算 |
返回值 | any | 参数的值 |
下面的例子获取第2个参数的值并转为string类型:
string s_value
s_value = method.get_arg_value(2)
5.5.20 invoke
调用方法。
any invoke()
any invoke(any v, ...)
参数与返回值 | 类型 | 描述 |
---|---|---|
v(可选,列表参数) | any | 调用方法的参数值 |
返回值 | any | 调用方法的返回值 |
下面的例子传参调用当前方法,并将返回值转为string类型:
string result
result = method.invoke('Nova', 42)
5.5.21 invoke_with_args_array
传入数组参数调用方法。
注:若方法中包含ref参数,调用完成后参数值将更新到入参数组
any invoke_with_args_array(ref any value[])
参数与返回值 | 类型 | 描述 |
---|---|---|
value | ref any[] | 调用方法的参数数组 |
返回值 | any | 调用方法的返回值 |
下面的例子传入数组参数调用当前方法,并将返回值转为string类型:
any args[]
string result
args[1] = 'Nova'
args[2] = 42
result = method.invoke_with_args_array(args)
5.5.22 invoke_with_args_object
传入对象参数调用方法。
注:若方法中包含ref参数,调用完成后参数值将更新到入参对象
any invoke_with_args_object(ref powerobject po)
参数与返回值 | 类型 | 描述 |
---|---|---|
po | ref PowerObject | 调用方法的参数对象 |
返回值 | any | 调用方法的返回值 |
下面的例子中,person为Structure类型,传入person对象参数调用当前方法,并将返回值转为string类型:
person p
string result
p.name = 'Nova'
p.age = 42
result = method.invoke_with_args_object(p)
5.6 PBEnum
本节中所有代码,均省略以下获取枚举类型 icon 的内容:
pbenum enum_icon
enum_icon = reflector.get_enum('icon')
5.6.1 get_name
获取当前枚举类型的名称。
string get_name()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | string | 当前枚举类型的名称 |
下面的例子获取当前枚举类型的名称:
string name
name = enum_icon.get_name()
5.6.2 get_item_count
获取当前枚举类型的枚举项数量。
long get_item_count()
参数与返回值 | 类型 | 描述 |
---|---|---|
返回值 | long | 当前枚举类型的枚举项数量 |
下面的例子获取当前枚举类型的枚举项数量:
long count
count = enum_icon.get_item_count()
5.6.3 get_item_name
获取对应枚举项的名称。
string get_item_name(long item_value)
参数与返回值 | 类型 | 描述 |
---|---|---|
item_value | long | 枚举项的值 |
返回值 | string | 对应枚举项的名称, 若枚举项不存在,返回null |
下面的例子获取当前枚举类型中值为1的枚举项的名称:
string item_name
item_name = enum_icon.get_item_name(1)
5.6.4 get_item_value
获取对应枚举项的值。
long get_item_value(string item_name)
参数与返回值 | 类型 | 描述 |
---|---|---|
item_name | string | 枚举项的名称 |
返回值 | long | 对应枚举项的值, 若枚举项不存在,返回-1 |
下面的例子获取当前枚举类型中名称为 stopsign 的枚举项的值:
long item_value
item_value = enum_icon.get_item_value('stopsign')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端