获取ABAP对象的标识号

时间:2013-12-04 18:42:01

标签: oop instance identity abap

在检查调试器中的对象实例时,它将按如下方式打印:

{O:9*CLASS=CL_SOMETHING}

是否可以从给定的对象引用中检索该类的标识号9? 我想区分同一个类的多个实例并打印它们的实例编号。

我发现没有办法使用RTTI来获取这些信息,有什么建议吗?

2 个答案:

答案 0 :(得分:2)

据我所知,您无法访问该内部对象标识符。调试器使用一些私有内核接口来执行此操作,普通用户无法访问。你可以尝试这样的事情:

CLASS lcl_object_id_map DEFINITION.

  PUBLIC SECTION.
    METHODS get_id
      IMPORTING ir_object TYPE REF TO object
        RETURNING value(r_id) TYPE sysuuid_c.

  PRIVATE SECTION.

    TYPES: BEGIN OF t_object_id,
             object TYPE REF TO object,
             id     TYPE sysuuid_c,
           END OF t_object_id,
           tt_object_id_map TYPE HASHED TABLE OF t_object_id
             WITH UNIQUE KEY object.

    DATA gt_object_id_map TYPE tt_object_id_map.

ENDCLASS.                    "lcl_object_id_map DEFINITION

*----------------------------------------------------------------------*

CLASS lcl_object_id_map IMPLEMENTATION.

  METHOD get_id.

    DATA: ls_entry TYPE t_object_id.
    FIELD-SYMBOLS: <ls_entry> TYPE t_object_id.

    READ TABLE gt_object_id_map
      ASSIGNING <ls_entry>
      WITH KEY object = ir_object.
    IF sy-subrc <> 0.
      ls_entry-object = ir_object.
      ls_entry-id = cl_system_uuid=>create_uuid_c32_static( ).
      INSERT ls_entry INTO TABLE gt_object_id_map ASSIGNING <ls_entry>.
    ENDIF.
    r_id = ls_entry-id.

  ENDMETHOD.                    "get_id

ENDCLASS.                    "lcl_object_id_map IMPLEMENTATION

答案 1 :(得分:0)

我实际上找到了一种(内部)方式来获取对象服务CL_OS_CA_COMMON=>OS_GET_INTERNAL_OID_BY_REF中对象的内部ID:

CALL 'OBJMGR_GET_INFO' ID 'OPNAME' FIELD 'GET_OBJID'
                       ID 'OBJID'  FIELD integer_oid
                       ID 'OBJ'    FIELD ref_to_object.

是的,这是内部事情......自担风险。