4

ローカル(およびグローバル)スコープの外にあるが、メモリ内に存在するオブジェクトの参照を取得する方法があるかどうかを確認しようとしています。

私のプログラムで、参照が次のオブジェクトをインスタンス化したとしましょう:{O:9 * \ PROGRAM = ZAVG_DELETE_THIS \ CLASS = LCL_SMTH}

大量の呼び出しの後、このオブジェクトにアクセスできない状況で、上記の文字列を知っているだけでこのオブジェクトの参照を取得するようなことができますか?

cl_abap_ * descrクラスを調べていましたが、オブジェクトの参照を返すために「program_name」、「class_name」、および「instance_number」を受け取るメソッドが見つかりませんでした。

私はこれをデバッグの目的で実行しようとしていますが、機能するものを構築するためではありません。

[編集1]:オブジェクトの参照を取得するには、o:9文字列が必要であると想定しました。@mydoghaswormsの応答で指摘されているように、これは当てはまりません。参照を保持する変数のローカル名だけが必要なようです。

4

1 に答える 1

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.
于 2013-02-20T18:15:05.013 に答える