[SAP ABAP開發技術總結]反射,動態創建內表、結構、變量


 

其實ABAP中沒有反射這一概念,這是從JAVA中來的,我只是個比喻。它也用於動態編程,比如來用動態的創建一個結構、內表等,雖然直接可以通過cl_alv_table_create=>create_dynamic_table的來動態創建一個內表,但在不借助於這些已有的方法時,我們該如何創建?

1.14.     反射

CL_ABAP_TYPEDESCR

  |--CL_ABAP_DATADESCR

  |   |--CL_ABAP_ELEMDESCR

  |   |--CL_ABAP_REFDESCR

  |   |--CL_ABAP_COMPLEXDESCR

  |       |--CL_ABAP_STRUCTDESCR

  |       |--CL_ABAP_TABLEDESCR

  |--CL_ABAP_OBJECTDESCR

     |--CL_ABAP_CLASSDESCR

     |--CL_ABAP_INTFDESCR

DATA: structtype  TYPE REF TO cl_abap_structdescr.
structtype ?= cl_abap_typedescr=>
describe_by_name( 'spfli' ).

 

DATA: datatype TYPE REF TO cl_abap_datadescr,
field(5) TYPE c
.
datatype ?= cl_abap_typedescr=>describe_by_
data( field ).

 

DATA: elemtype TYPE REF TO cl_abap_elemdescr.
elemtype = cl_abap_elemdescr=>
get_i( ).
elemtype = cl_abap_elemdescr=>
get_c( 20 ).

 

DATA: oref1 TYPE REF TO object.
DATA: descr_ref1 TYPE REF TO cl_abap_typedescr.
CREATE OBJECT oref1
TYPE ('C1'). "C1為類名
descr_ref1
= cl_abap_typedescr=>describe_by_object_ref( oref1 ).

還有一種:describe_by_data_ref

1.14.1.           TYPE HANDLE

handle只能是CL_ABAP_DATADESCR或其子類的引用變量只能用於Data類型,不能用於Object類型即不能用於CL_ABAP_ OBJECTDESCR所以沒有:

CREATE OBJECT dref TYPE HANDLE objectDescr.

 

DATA: dref TYPE REF TO data,
c10type
TYPE REF TO cl_abap_elemdescr.
c10type
= cl_abap_elemdescr=>get_c( 10
).
CREATE DATA dref TYPE HANDLE c10type.

DATA: x20type TYPE REF TO cl_abap_elemdescr.
x20type
= cl_abap_elemdescr=>get_x( 20 ).
FIELD-SYMBOLS: <fs> TYPE any
.
ASSIGN dref->* TO <fs> CASTING TYPE HANDLE x20type.

1.14.2.           動態創建數據Data或對象Object

  TYPES: ty_i TYPE i.
 
DATA: dref TYPE REF TO ty_i .

 
 CREATE DATA dref TYPE ('I')."根據基本類型名動態創建數據
  dref->* = 1.
 
WRITE: / dref->*." 1

  CREATE OBJECT oref TYPE ('C1')."根據類名動態創建實例對象

1.14.3.           動態創建基本類型變量、結構、內表

DATA: dref_str TYPE REF TO data,
      dref_tab
TYPE REF TO data,
      dref_i
TYPE REF TO data,
  itab_type
TYPE REF TO cl_abap_tabledescr,
  struct_type
TYPE REF TO cl_abap_structdescr,
  elem_type
TYPE REF TO cl_abap_elemdescr,
  table_type
TYPE REF TO cl_abap_tabledescr,
  comp_tab
TYPE cl_abap_structdescr=>component_table WITH HEADER LINE.
FIELD-SYMBOLS :<fs_itab> TYPE ANY TABLE.

**=========動態創建基本類型
elem_type ?= cl_abap_elemdescr
=>get_i( ).
CREATE DATA
dref_i TYPE HANDLE elem_type ."動態的創建基本類型數據對象

**=========動態創建結構類型
struct_type ?= cl_abap_typedescr
=>describe_by_name( 'SFLIGHT' )."結構類型
comp_tab[]
= struct_type
->get_components( )."組成結構體的各個字段組件
* 向結構中動態的新增一個成員
comp_tab-name = 'L_COUNT'."為結構新增一個成員
comp_tab-type = elem_type."新增成員的類型對象
INSERT comp_tab INTO comp_tab INDEX 1.
* 動態創建結構類型對象
struct_type
= cl_abap_structdescr
=>create( comp_tab[] ).
CREATE DATA
dref_str TYPE HANDLE struct_type."使用結構類型對象來創建結構對象

**=========動態創建內表
* 基於結構類型對象創建內表類型對象
itab_type = cl_abap_tabledescr
=>create( struct_type ).
CREATE DATA
dref_tab TYPE HANDLE itab_type."使用內表類型對象來創建內表類型
ASSIGN dref_tab->* TO <fs_itab>."將字段符號指向新創建出來的內表對象

"**========給現有的內表動態的加一列
table_type ?= cl_abap_tabledescr
=>describe_by_data( itab ).
struct_type ?= table_type
->get_table_line_type( ).
comp_tab[]
= struct_type
->get_components( ).
comp_tab
-name = 'FIDESC'.
comp_tab
-type = cl_abap_elemdescr
=>get_c( 120 ).
INSERT comp_tab INTO comp_tab INDEX 2.
struct_type
= cl_abap_structdescr
=>create( comp_tab[] ).
itab_type
= cl_abap_tabledescr
=>create( struct_type ).
CREATE DATA
dref_tab TYPE HANDLE itab_type.

1.14.4.類對象反射

CLASS c1 DEFINITION.
 
PUBLIC SECTION.
   
DATA: c VALUE 'C'.
   
METHODS: test.
ENDCLASS.

CLASS c1 IMPLEMENTATION.
 
METHOD:test.
   
WRITE:/ 'test'.
 
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
 
TYPES: ty_c.
 
DATA: oref TYPE REF TO object .
 
DATA: oref_classdescr TYPE REF TO cl_abap_classdescr .

 
CREATE OBJECT oref TYPE ('C1')."根據類名動態創建實例對象
 
"相當於Java中的Class類對象
  oref_classdescr ?= cl_abap_classdescr
=>describe_by_object_ref( oref ).

 
DATA: t_attrdescr_tab TYPE abap_attrdescr_tab WITH HEADER LINE,"類中的屬性列表
        t_methdescr_tab
TYPE abap_methdescr_tab WITH HEADER LINE."類中的方法列表
 
FIELD-SYMBOLS <fs_attr> TYPE any.
  t_attrdescr_tab[]
= oref_classdescr->attributes.
  t_methdescr_tab[]
= oref_classdescr->methods.
 
LOOP AT t_attrdescr_tab."動態訪問類中的屬性
   
ASSIGN oref->(t_attrdescr_tab-name) TO <fs_attr>.
    WRITE: / <fs_attr>.
 
ENDLOOP.
 
LOOP AT t_methdescr_tab."動態訪問類中的方法
   
CALL METHOD oref->(t_methdescr_tab-name).
  ENDLOOP.
image033

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM