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

时间:2013-02-20 12:48:35

标签: debugging reflection scripting abap

我试图看看是否有办法获得一个超出本地(和全局)范围的对象的引用,但是它存在于内存中。

让我们说在我的程序中,我已经实例化了一个对象,其引用如下: {○:9 * \ PROGRAM = ZAVG_DELETE_THIS \ CLASS = LCL_SMTH}

在大量的调用之后,在我无法访问此对象的上下文中,我是否可以通过了解上述字符串来获取此对象的引用?

我正在查看cl_abap_ * descr类,但我没有找到一个方法,它接受'program_name','class_name'和'instance_number'来返回一个对象的引用。

我正在尝试这样做以进行调试,而不是构建有效的东西。

[编辑1]: 我假设需要o:9字符串才能获得对象的引用。正如@mydoghasworms的回应中指出的那样,情况并非如此。似乎我只需要保存引用的变量的本地名称。

1 个答案:

答案 0 :(得分:1)

我希望我能正确理解你的问题,因为我不确定你的意思是“为了调试”,但是这里有:

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

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.