Debugging 如何(如果可能)获取内存中对象(类实例)的引用?

Debugging 如何(如果可能)获取内存中对象(类实例)的引用?,debugging,reflection,scripting,abap,Debugging,Reflection,Scripting,Abap,我想看看是否有办法获得一个对象的引用,该对象不在本地(和全局)范围内,但存在于内存中 比如说,在我的程序中,我实例化了一个引用如下的对象: {O:9*\PROGRAM=ZAVG\u DELETE\u THIS\CLASS=LCL\u SMTH} 在经过大量调用之后,在我无法访问该对象的上下文中,我是否可以做一些事情,比如通过知道上面的字符串来获取该对象的引用 我正在研究cl_abap_*descr类,但是我还没有找到一个使用“program_name”、“class_name”和“instanc

我想看看是否有办法获得一个对象的引用,该对象不在本地(和全局)范围内,但存在于内存中

比如说,在我的程序中,我实例化了一个引用如下的对象: {O:9*\PROGRAM=ZAVG\u DELETE\u THIS\CLASS=LCL\u SMTH}

在经过大量调用之后,在我无法访问该对象的上下文中,我是否可以做一些事情,比如通过知道上面的字符串来获取该对象的引用

我正在研究cl_abap_*descr类,但是我还没有找到一个使用“program_name”、“class_name”和“instance_number”返回对象引用的方法

我试着这样做是为了调试,而不是构建一些可以工作的东西

[编辑1]:
我假设o:9字符串是获取对象引用所必需的。正如@mydoghasworms在回复中指出的,事实并非如此。似乎我只需要保存引用的变量的本地名称。

我希望我能正确理解您的问题,因为我不确定您所说的“为了调试的目的”是什么意思,但下面是:

您可以使用以下方法访问加载在同一会话内存中的另一个程序的变量(我非常确定它不需要在调用堆栈中):

对于引用变量,它会变得有点棘手,但下面是一个有助于演示的示例

这是我们的调用程序,它包含一个参考变量
LR_TEST
,我们希望在其他地方访问该变量。为了演示的目的,我引用了一个本地定义的类(因为这是我从您的问题中收集的)

这是我们想要从上面的程序中访问变量的程序

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.
报告ZCALLEE。
打电话给我。
字段符号:。
数据:ld_测试类型参考对象。
数据:lv_val i型。
*附件A:获取对“外部”对象实例的引用
将(‘(ZCALLER)LR_测试’)分配给。
*现在包含程序中对类实例的引用
*ZCALLER(不是很有用,除了可能传递)
*附件B:从“外部”类实例获取公共属性
将('(ZCALLER)LR_TEST->MYVAL')分配给。
*现在包含属性MYVAL的值
*附件C:获取对实例的引用并调用方法
将(‘(ZCALLER)LR_测试’)分配给。“再次引用类引用
如果sy subrc=0。“规则:在分配前始终检查sy subrc。”
“访问字段符号!(但您知道)
ld_test=”现在我们有了一个具体的手柄
*现在,我们使用实例句柄进行动态方法调用
调用方法ld_test->('MY_METH')
进口
e_val=lv_val。
恩迪夫。
尾型。

我真诚地希望这是不可能的……不仅是可能的(我将很快演示),而且它实际上非常方便!(虽然我不知道你所说的“为了调试”是什么意思-希望我能正确理解你!)@mydoghasworms:你没有解决上面提到的问题,请看下面的评论。是的,现在你指出了@vlad ardelean,这个的实际应用是什么?当程序中的字符串可能总是不同的时候,你怎么知道它呢?(O:9引用不能保证是相同的)。@mydoghasworms-虽然我不知道O:9引用是否相同,但我确实希望“某物”是相同的,因为我希望对象保持在相同的内存位置,而不管当前堆栈的位置如何-所以我应该概括这个问题。thx指出了这一点顺便说一句,如果使用SUBMIT在某个地方调用后一个程序,这将不起作用,因为它在单独的内部会话中执行,因此会丢失原始会话的上下文,所以请注意!我知道那个“后门”,但这并不能回答最初的问题,因为您需要一个引用实例的静态变量。你不能使用这种技术通过“实例ID”访问任意实例。啊,是的,现在我又读了一遍这个问题,我理解得更好了。这已经足够好了——我假设实例ID是我获取对象引用所需的。现在我看到我实际上只需要变量名。
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.