我想看看是否有办法获得一个在本地(和全局)范围之外但存在于内存中的对象的引用。
假设在我的程序中,我实例化了一个引用如下的对象:{O:9*\PROGRAM=ZAVG_DELETE_THIS\CLASS=LCL_SMTH}
在经历了大量调用之后,在我无法访问这个对象的上下文中,我可以通过知道上面的字符串来获得这个对象的引用吗?
我正在研究cl_abap_*descr类,但我没有找到一个使用"program_name"、"class_name"one_answers"instance_number"来返回对象引用的方法。
我尝试这样做是为了调试,而不是构建一些有效的东西。
[编辑1]:我假设需要o:9字符串才能获得对象的引用。正如@mydoghasworms在回复中指出的那样,事实并非如此。我似乎只需要保存引用的变量的本地名称。
我希望我能正确理解你的问题,因为我不确定你说的"为了调试"是什么意思,但这里是:
您可以访问加载在同一会话内存中的另一个程序的变量(我很确定它不需要在调用堆栈中),使用:
ASSIGN ('(PROGRAM)VARIABLE') TO LV_LOCAL.
对于引用变量,它变得有点棘手,但这里有一个示例将有助于演示。
这是我们的调用程序,它包含一个引用变量LR_TEST
,我们想在其他地方访问它。为了演示的目的,我引用了一个本地定义的类(因为这是我从您的问题中收集到的)。
REPORT ZCALLER.
class lcl_test definition.
public section.
data: myval type i.
methods: my_meth exporting e_val type i.
endclass.
data: lr_test type ref to lcl_test.
CREATE OBJECT lr_test.
lr_test->MYVAL = 22.
perform call_me(zcallee).
class lcl_test implementation.
method my_meth.
* Export the attribute myval as param e_val.
e_val = myval.
endmethod.
endclass.
这是我们想要从上面的程序中访问变量的程序。
REPORT ZCALLEE.
form call_me.
field-symbols: <ref>.
data: ld_test type ref to object.
data: lv_val type i.
* Exhibit A: Gettinf a reference to a 'foreign' object instance
assign ('(ZCALLER)LR_TEST') to <ref>.
* <ref> now contains a reference to the class instance from the program
* ZCALLER (not very useful, except for passing around maybe)
* Exhibit B: Getting a public attribute from a 'foreign' class instance
assign ('(ZCALLER)LR_TEST->MYVAL') to <ref>.
* <ref> now contains the value of the attribute MYVAL
* Exhibit C: Getting a reference to an instance and calling a method
assign ('(ZCALLER)LR_TEST') to <ref>. "Again the class reference
if sy-subrc = 0. "Rule: Always check sy-subrc after assign before
"accessing a field symbol! (but you know that)
ld_test = <ref>. "Now we have a concrete handle
* Now we make a dynamic method call using our instance handle
CALL METHOD ld_test->('MY_METH')
IMPORTING
e_val = lv_val.
endif.
endform.