PB语言实现反射机制

PowerReflect

PowerReflect是一个实现PB语言反射功能的PBNI项目。使用这个项目便能够在运行时获取PB中类的信息、类的属性和方法,动态修改对象的属性,动态调用对象的方法。

1、项目构成

本项目包含的类及相应功能说明如下:

类名功能
PBReflector反射器,用于访问项目的库、类、函数、对象等信息
PBLibrary库对象,用于访问PBL或PBD内部的类和方法
PBClass类对象,用于访问类的信息、类的属性和方法
PBField属性对象,用于访问类的属性或全局变量、共享变量
PBMethod方法对象,用于访问类的方法或全局函数、系统函数
PBEnum枚举对象,用于访问内置的枚举类型信息

2、项目依赖

本项目无依赖,只需在PB10及以上项目中导入PowerReflect.dll即可使用。

3、功能概要

3.1 PBReflector

PBReflector为反射器,主要实现以下功能:

  1. 获取项目的PBL或指定的PBL
  2. 获取类、函数、全局变量、枚举类型
  3. 获取对象的类、内嵌对象、属性、方法、事件

PBReflector的方法列表及说明如下:

方法名参数列表说明
get_librariesref PBLibrary[]获取当前项目的所有库
get_librarystring按名称获取库
get_classstring按名称获取类
get_functionstring按名称获取全局函数
get_system_functionstring按名称获取系统函数
get_system_functionstring, string按名称和签名获取系统函数
get_global_varsref PBField[]获取当前项目所有全局变量
get_global_varstring按名称获取全局变量
get_enumstring按名称获取枚举对象
get_classPowerObject获取对象的类
is_instancePowerObject, PBClass判断是对象是否是类的实例
get_nested_objectsPowerObject, ref PowerObject[]获取对象的所有内嵌对象
get_nested_objectPowerObject, string按名称获取对象的内嵌对象
get_fieldsref PowerObject, ref PBField[]获取对象的所有属性
get_fieldref PowerObject, string按名称获取对象的属性
get_methodsPowerObject, ref PBMethod[]获取对象的所有方法
get_methodsPowerObject, string, PBMethod[]按名称获取对象的方法
get_methodPowerObject, string按名称获取对象的一个方法
get_methodPowerObject, string, string按名称和签名获取对象的方法
get_methodPowerObject, string, string[]按名称和参数列表获取对象的方法
get_eventsPowerObject, PBMethod[]获取对象的所有事件
get_eventPowerObject, string按名称获取对象的事件

3.2 PBLibrary

PBLibrary为描述PBL或PBD的类,主要实现以下功能:

  1. 获取该PBL或PBD下所有的UserObject、Structure、Window、Menu类
  2. 获取该PBL或PBD下所有的全局函数

PBLibrary的方法列表及说明如下:

方法名参数列表说明
get_name获取库的名称
get_userobjectsref PBClass[]获取当前库内的所有UserObjects
get_structuresref PBClass[]获取当前库内的所有结构体
get_functionsref PBMethod[]获取当前库内的所有全局函数
get_windowsref PBClass[]获取当前库内的所有窗口
get_menusref PBClass[]获取当前库内的所有菜单

3.3 PBClass

PBClass为描述PB中类的类,主要实现以下功能:

  1. 获取该类的基本信息
  2. 获取该类的超类、内嵌类、属性、方法、事件、共享变量

PBClass的方法列表及说明如下:

方法名参数列表说明
get_name获取类的名称
equals判定类是否相等
get_superclass获取超类
is_superclass_ofPBClass判定是否为超类
is_subclass_ofPBClass判定是否为子类
is_structure判定是否为结构体
is_visual_type判定是否为可视类
is_nested_class判定是否为内嵌类
create_object创建对象
get_nested_class_count获取内嵌类数量
get_nested_classesref PBClass[]获取所有内嵌类
get_nested_classesstring, ref PBClass[]按名称获取内嵌类列表
get_nested_classstring按名称获取内嵌类
get_parent_class获取容器类
get_field_count获取属性数量
get_fieldsref PBField[]获取所有属性
get_fieldstring按名称获取属性
get_method_count获取方法数量
get_methodsref PBMethod[]获取所有方法
get_methodsstring, ref PBMethod[]按名称获取方法列表
get_methodstring按名称获取方法
get_methodstring, string按名称和签名获取方法
get_methodstring, string[]按名称和参数列表获取方法
get_event_count获取事件数量
get_eventsref PBMethod[]获取所有事件
get_eventstring按名称获取事件
get_shared_var_count获取共享变量数量
get_shared_varsref PBField[]获取所有共享变量
get_shared_varstring按名称获取共享变量

3.4 PBField

PBField为描述PB中属性(包括全局变量、实例变量、共享变量)的类,主要实现以下功能:

  1. 获取该属性的基本信息
  2. 获取和修改属性的值

PBField的方法列表及说明如下:

方法名参数列表说明
get_name获取属性名称
get_read_access获取读权限
get_write_access获取写权限
get_kind获取属性类型
is_null判定属性是否为空值
is_array判定属性是否为数组
get_category获取属性类型分类
get_class获取属性类型
get_type获取属性系统类型名称
set_objectPowerObject为类属性设置对象
get_value获取属性的值
set_valueany设置属性的值
set_null设置属性为空值
update_valueany更新可视属性的值

3.5 PBMethod

PBMethod为描述PB中方法(包括全局函数、系统函数、类的方法和事件)的类,主要实现以下功能:

  1. 获取该方法的基本信息
  2. 获取该方法的参数和返回值信息
  3. 调用该方法

PBMethod的方法列表及说明如下:

方法名参数列表说明
get_name获取方法名称
get_access获取调用权限
get_kind获取方法分类
get_arg_count获取参数数量
has_list_arg判定是否有列表参数
get_arg_nameint获取参数名
get_arg_idstring获取参数位置
is_arg_nullint判定参数是否为控制
is_arg_arrayint判定参数是否为数组
get_arg_categoryint获取参数类型分类
get_arg_conventionint获取参数传递方式
get_arg_classint获取参数类型
get_arg_typeint获取参数系统类型名称
has_return_value判定是否有返回值
get_return_category获取返回值类型分类
get_return_class获取返回值类型
get_return_type获取返回值系统类型名称
set_objectPowerObject为方法或事件设置对象
get_arg_valueint获取参数值
invoke无参调用方法
invokeany, …传参调用方法
invoke_with_args_arrayref any[]使用数组参数调用方法
invoke_with_args_objectref PowerObject使用对象参数调用方法

3.6 PBEnum

PBEnum为描述PB内置枚举类型的类,主要实现以下功能:

  1. 获取该枚举类型的基本信息
  2. 获取枚举项的值或名称

PBEnum的方法列表及说明如下:

方法名参数列表说明
get_name获取枚举名称
get_item_count获取可枚举数量
get_item_namelong获取枚举项目名称
get_item_valuestring获取枚举项目值

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[])
参数与返回值类型描述
librariesref PBLibrary[]当前项目的库对象数组
返回值long获取到的库对象数量

下面的例子获取当前运行项目的所有PBL对象:

pblibrary pbls[]
reflector.get_libraries(pbls)
5.1.2 get_library

按文件名获取指定的库对象。

PBLibrary get_library(string library_name)
参数与返回值类型描述
library_namestring指定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_namestring要获取的类的名称
返回值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_namestring要获取的全局函数的名称
返回值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_namestring要获取的系统函数的名称
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[])
参数与返回值类型描述
varsref PBField[]获取到的所有全局变量对象数组
返回值long获取到的全局变量数量

下面的例子获取到项目所有的全局变量对象:

pbfield gvars[]
reflector.get_global_vars(gvars)
5.1.7 get_global_var

按变量名获取全局变量对象。

PBField get_global_var(string var_name)
参数与返回值类型描述
var_namestring全局变量名
返回值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_namestring枚举类型名称
返回值PBEnum获取到的枚举类型对象,
如果枚举类型不存在,返回null

下面的例子获取到名称为 icon 的枚举类型对象:

pbenum enum_icon
enum_icon = reflector.get_enum('icon')
5.1.9 get_class

获取传入对象的类对象。

PBClass get_class(PowerObject po)
参数与返回值类型描述
poPowerObject任意对象
返回值PBClass传入对象的类对象

下面的例子获取当前按钮对象的类对象:

pbclass cls_cb
cls_cb = reflector.get_class(this)
5.1.10 is_instance

判定对象是否是类的实例。

boolean is_instance(powerobject po, PBClass c)
参数与返回值类型描述
poPowerObject任意对象
cPBClass类对象
返回值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[])
参数与返回值类型描述
poPowerObject任意对象
objectsref 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)
参数与返回值类型描述
poPowerObject任意对象
object_namestring内嵌对象的名称
返回值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[])
参数与返回值类型描述
poref PowerObject任意对象
fieldsref 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)
参数与返回值类型描述
poref PowerObject任意对象
field_namestring实例属性名称
返回值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[])
参数与返回值类型描述
poref PowerObject任意对象
method_name(可选)string方法名称
methodsref 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[]})
参数与返回值类型描述
poref PowerObject任意对象
method_namestring方法名称
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[])
参数与返回值类型描述
poref PowerObject任意对象
eventsref PBMethod[]获取到的事件对象数组
返回值long获取到的事件对象数量

下面的例子获取当前窗口的所有事件对象:

pbmethod events[]
reflector.get_events(parent, events)
5.1.18 get_event

按事件名称获取对象的事件对象。

PBMethod get_event(powerobject po, string event_name)
参数与返回值类型描述
poref PowerObject任意对象
event_namestring事件名称
返回值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[])
参数与返回值类型描述
classesref 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[])
参数与返回值类型描述
structuresref 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[])
参数与返回值类型描述
methodsref 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[])
参数与返回值类型描述
windowsref 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[])
参数与返回值类型描述
menusref 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)
参数与返回值类型描述
clsPBClass需要比较的类
返回值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)
参数与返回值类型描述
clsPBClass任意类对象
返回值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)
参数与返回值类型描述
clsPBClass任意类对象
返回值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_namestring内嵌类名称
classesref 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_namestring内嵌类的名称
返回值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[])
参数与返回值类型描述
fieldsref PBField[]当前类型的所有实例属性
返回值long当前类型实例属性的数量

下面的例子获取当前类型的所有实例属性:

pbfield fields[]
cls_demo.get_fields(fields)
5.3.16 get_field

按属性名称获取当前类型的实例属性。

PBField get_field(string field_name)
参数与返回值类型描述
field_namestring属性名称
返回值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方法名称
methodsref 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_namestring方法名称
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[])
参数与返回值类型描述
eventsref PBMethod[]当前类型的所有事件
返回值long当前类型事件的数量

下面的例子获取当前类型的所有事件:

PBMethod events[]
cls_demo.get_events(events)
5.3.22 get_event

按事件名称获取当前类型的事件。

PBMethod get_event(string event_name)
参数与返回值类型描述
event_namestring事件名称
返回值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[])
参数与返回值类型描述
varsref 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_namestring共享属性名称
返回值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)
参数与返回值类型描述
poref 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)
参数与返回值类型描述
valueany要设置的属性的值,
若类型不匹配,将抛出异常

下面的例子将当前属性的值设置为 ‘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)
参数与返回值类型描述
valueany要设置的属性的值,
若类型不匹配,将抛出异常

下面的例子将当前窗口上 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)
参数与返回值类型描述
iint参数位置,从1开始计算
返回值string参数名称

下面的例子获取当前方法第2个参数的名称:

string name
name = method.get_arg_name(2)
5.5.7 get_arg_id

获取参数的位置。

int get_arg_id(string name)
参数与返回值类型描述
namestring参数名称
返回值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)
参数与返回值类型描述
iint参数位置,从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)
参数与返回值类型描述
iint参数位置,从1开始计算
返回值boolean对应参数否定义为数组

下面的例子判定当前方法第2个参数是否定义为数组:

boolean b
b = method.is_arg_array(2)
5.5.10 get_arg_category

获取第i个参数定义类型的分类。

TypeCategory get_arg_category(int i)
参数与返回值类型描述
iint参数位置,从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)
参数与返回值类型描述
iint参数位置,从1开始计算
返回值ArgCallingConvention对应参数的传递方式

下面的例子获取当前方法第2个参数的传递方式:

argcallingconvention convention
convention = method.get_arg_convention(2)
5.5.12 get_arg_class

获取第i个参数定义的类型。

PBClass get_arg_class(int i)
参数与返回值类型描述
iint参数位置,从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)
参数与返回值类型描述
iint参数位置,从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)
参数与返回值类型描述
poref 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)
参数与返回值类型描述
iint参数位置,从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[])
参数与返回值类型描述
valueref 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)
参数与返回值类型描述
poref 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_valuelong枚举项的值
返回值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_namestring枚举项的名称
返回值long对应枚举项的值,
若枚举项不存在,返回-1

下面的例子获取当前枚举类型中名称为 stopsign 的枚举项的值:

long item_value
item_value = enum_icon.get_item_value('stopsign')

6、关于作者

WX、TEL:18649713925
QQ:768310524

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pb实现socket是一种通过Protocol Buffers(简称pb)协议来实现的网络通信方式。Protocol Buffers是一种轻量级、高效的数据交换格式,可以用于结构化数据的序列化和反序列化。 针对pb实现的Socket通信,首先需要定义好通信协议。这包括在pb中定义好需要交换的数据结构以及相应的字段和类型。可以使用pb语言定义文件(如.proto文件)来描述这些信息。 接下来,需要使用pb的编译器将.proto文件编译成对应的代码文件,这些代码文件将包含pb相关的类和方法。 在编写pb实现Socket的代码时,需要在发送数据的一端将数据结构序列化为pb的二进制格式,并通过Socket发送给接收数据的一端。在接收数据的一端,通过Socket接收到数据后,需要将接收到的二进制数据反序列化为对应的数据结构。 在实际应用中,可使用各种编程语言提供的pb库来实现pb的序列化和反序列化操作。同时,也需要使用Socket编程相关的库或API来进行Socket通信操作。 pb实现Socket的优点是数据传输效率高,可跨平台使用,且可以使用不同语言实现不同端的通信。缺点是对于较为简单的通信需求,pb的使用可能会显得繁琐,且在数据结构变动较大时,可能需要重新编译生成代码。 总结来说,pb实现Socket是一种高效、灵活的网络通信方式,可以通过定义好的pb协议和相应的代码实现数据的序列化和反序列化,在Socket通信中进行数据的传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值