一、类的反射
1.$CLASSNAME:获取类的名称
2.%Dictionary.ClassDefinition
1)获取类名: Name
2)获取方法: Methods
3)获取Query: Queries
4)遍历类的属性: Properties
Set cdef = ##class(%Dictionary.ClassDefinition).%OpenId("User.DHCBPArrange")
Write cdef.Name,!
// get list of properties
Set count = cdef.Properties.Count()
For i = 1:1:count {
Write cdef.Properties.GetAt(i).Name,!
}
3.PROPERTY:通过属性名设置属性值
set $PROPERTY(arrange, i)=value
4.$PROPERTY:通过属性名获取属性值
Set arrange=##class(User.DHCBPArrange).%OpenId(3)
FOR i = "BPABPCBedDr", "BPABPPatRegisterDr","BPAStatus"
{
WRITE i, ": ", $PROPERTY(arrange, i), !
}
5.获取Method入参数
set myobj=##class(%Dictionary.CompiledMethod).%OpenId(className_"||"_methodName,0)
set paramList=myobj.FormalSpecParsed
set len=$LISTLENGTH(paramList)
6.获取Query入参数
set myobj=##class(%Dictionary.CompiledQuery).%OpenId(ClassName_"||"_QueryName,0)
set paramsNames = $lts(myobj.ParmNames)
set colCount=rset.GetColumnCount()
set colName=rset.GetColumnName(colIndex)
二、对象的反射
1.创建与打开对象
C
L
A
S
S
M
E
T
H
O
D
(
c
l
a
s
s
N
a
m
e
,
"
/
/
动态打开对象
s
e
t
c
l
a
s
s
=
"
U
s
e
r
.
D
H
C
A
N
O
P
A
r
r
a
n
g
e
"
s
e
t
o
b
j
=
CLASSMETHOD(className,"%New") // 动态打开对象 set class="User.DHCANOPArrange" set obj=
CLASSMETHOD(className,"//动态打开对象setclass="User.DHCANOPArrange"setobj=CLASSMETHOD(class,“%OpenId”,1)
2.$PROPERTY:通过属性名设置属性值
Set $PROPERTY([obj], [name))=[value]
// 设备
set $PROPERTY(obj, name)=value
// 获取
set value=$PROPERTY(obj, name)
三、动态变量的反射
1.按键值获取、删除、设置值
%Get(key):获取值
%Remove(key):删除
%Set(key, value, type):设置值
2.遍历
s obj={}
s obj.Name="Lijie"
s obj.Sex="Male"
set iter = obj.%GetIterator()
while iter.%GetNext(.key , .value ) {
write "key = "_key_" , value = "_value,!
}
四、调用栈
1. 日志记录
不再废话以示例说明
// w ##class(CIS.AN.BL.SystemRunLog).A()
ClassMethod A()
{
quit ..B()
}
ClassMethod B()
{
set placeStack=""
set codeStack=""
for loop=0:1:$Stack(-1)
{
set placeStack=placeStack_"=>"_$STACK(loop,"PLACE")
set codeStack=codeStack_"=>"_$STACK(loop,"MCODE")
}
set codeStack=$Replace(codeStack," ","")
set codeStack=$Replace(codeStack," ","")
w codeStack,!
//set ^TmpANDebug("TestB")=%STACK
return 0
}
2. 显示当前调用栈
如果是在调试时,可使用以下语句显示栈:
do ^%STACK