[SAP ABAP开发技术总结]反射,动态创建内表、结构、变量

其实ABAP中没有反射这一概念,这是从JAVA中来的,我只是个比喻。它也用于动态编程,比如来用动态的创建一个结构、内表等,虽然直接可以通过cl_alv_table_create=>create_dynamic_table的来动态创建一个内表,但在不借助于这些已有的方法时,我们该如何创建?

1.14.         反射

1.14.1.     TYPE HANDLE

1.14.2.     动态创建数据Data或对象Object

1.14.3.     动态创建基本类型变量、结构、内表

1.14.4.     类对象反射

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(5TYPE 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_c20 ).

 

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.

 

DATAdref TYPE REF TO data,
c10type TYPE REF TO cl_abap_elemdescr.
c10type cl_abap_elemdescr=>get_c10 ).
CREATE DATA dref TYPE HANDLE c10type.

DATAx20type TYPE REF TO cl_abap_elemdescr.
x20type cl_abap_elemdescr=>get_x20 ).
FIELD-SYMBOLS<fs> TYPE any.
ASSIGN dref->TO <fs> CASTING TYPE HANDLE x20type.

1.14.2.           动态创建数据Data或对象Object

  TYPESty_i TYPE i.
  DATAdref 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.
    DATAc VALUE 'C'.
    METHODStest.
ENDCLASS.

CLASS c1 IMPLEMENTATION.
  METHOD:test.
    WRITE:'test'.
  ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
  TYPESty_c.
  DATAoref TYPE REF TO object .
  DATAoref_classdescr TYPE REF TO cl_abap_classdescr .
  CREATE OBJECT oref TYPE ('C1')."根据类名动态创建实例对象
  "相当于Java中的Class类对象
  oref_classdescr ?= cl_abap_classdescr=>describe_by_object_reforef ).

  DATAt_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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: SAP ABAP开发技术详解(实例篇)是一本SAP ABAP开发技术书籍的实例版本,旨在通过实例让读者更好地理解和掌握SAP ABAP开发技术。该书以实例为基础,详实阐述了SAP ABAP开发技术的各种知识点,包括ABAP程序语言、ABAP开发工具、ABAP数据字典、ABAP界面编程、ABAP Web Dynpro等相关内容。 该书的实例设计非常实用,具有一定的参考价值。例如,作者通过案例讲解了如何使用SAP函数模块来实现特定的业务需求,如查询订单数据、创建销售订单、修改物料信息等;同时,还详细介绍了SAP ABAP开发工具的使用方法,包括ABAP工具、SAP代码调试器、断点调试等等。 此外,该书还深入解析了SAP ABAP数据字典的概念及其应用,如表格的创建、字段的添加、数据类型的定义等,特别是多种数据结构的应用和数据字典中的关键字等方面。此外,还介绍了采用Web Dynpro技术进行的图形化开发界面的构建过程,以及各种UI控件、Web Dynpro组件和SAP GUI控件等的应用及其聚合方法。 总之,《SAP ABAP开发技术详解(实例篇)》是一本非常实用的技术书籍,对于想要深入了解SAP ABAP开发技术的开发人员和SAP学习者来说是一本必读书籍。里面的实例都可以供读者参考,了解如何运用开发技术解决实际现场问题,是一本非常有价值的技术书籍。 ### 回答2: SAP ABAP开发技术详解(实例篇)PDF是一本介绍SAP ABAP编程语言的书籍。该书籍主要介绍了SAP ABAP开发应用程序的基本概念、技术、语言和实现方法,以及通过实例来展示如何应用这些概念和技术,来开发SAP应用。该书籍以实例为主线,目的是通过实践帮助读者更深入地理解SAP ABAP编程。 在书籍中,作者首先介绍了SAP ABAP语言的基础知识,包括数据类型、变量、常量、控制语句、函数模块、内表、工具、类和对象等。接着,作者通过实例演示了如何使用ABAP语言开发常用的SAP应用,例如SAP界面设计、SAP查询等。同时,作者还介绍了如何使用ABAP语言与SAP系统进行交互,例如如何处理存储在SAP系统中的数据、如何使用SAP标准功能等。 通过该书籍,读者可以了解到SAP ABAP编程语言的基本原理和应用方法,具备开发SAP应用程序的基本能力。同时,该书籍以实例为主线,具有很强的实用性,对于SAP ABAP编程初学者和开发人员来说,是一本非常值得阅读的书籍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChampaignWolf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值