ABAP RTTI(Run Time Type Identification)介绍与反射机制

RTTI运行时类型识别 即Run Time Type Identification的简称,是ABAP OO中引入的概念。它可以应用于所有的ABAP类型,所以DESCRIBE FIELD,DESCRIBE TABLE可以被替代。对于不同的类型都有不同的描述类,为了得到一个类型的description object你必须使用CL_ABAP_TYPEDESCR的静态方法来得到相应的description class。在runtime中,每一个类型只有一个description object。

ABAP中的反射机制应该都是使用面向对象实现的,目前了解到的有动态获取透明表(结构)的结构信息,动态获取内表的结构。所有这些动态是利用CL_ABAP_TYPEDESCR类及其子类实现的,从结构定义获取中利用的是describe_by_name方法,从内表变量中获取利用的是describe_by_data方法。

这种反射算是ABAP语言的RTTI(运行时类型识别)的一部分。


CL_ABAP_TYPEDESCR和它的子类的结构图
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

 

2. 动态获取结构/透明表的结构

主要使用了cl_abap_typedescr类的describe_by_name静态方法,使用这个方法获取结构的描述信息,从描述信息里可以得到结构的字段列表等信息。

下面是一个动态获取一个结构变量中的指定字段的值的示例代码。

[plain]  view plain copy
  1. *" ------------------------------------------------------- "*  
  2. *" p_variable_name 为结构的变量名  
  3. *" p_strtuct_name  为结构名称  
  4. *" field_name      为一字符串,用于为FIELD-SYMBOLS拼出变量名  
  5. *" <field_value>   指针  
  6. *" ------------------------------------------------------- "*  
  7. DATA : idetails TYPE abap_compdescr_tab,  
  8.        xdetails TYPE abap_compdescr.  
  9.        ref_table_des TYPE REF TO cl_abap_structdescr.  
  10. FIELD-SYMBOLS <field_value> .  
  11.   
  12. " 根据结构名p_strtuct_name获取结构描述信息  
  13. ref_table_des ?= cl_abap_typedescr=>describe_by_name( p_strtuct_name ).  
  14. " 从结构描述信息中获取字段列表  
  15. idetails[] = ref_table_des->components[].  
  16.   
  17. LOOP AT idetails INTO xdetails.  
  18. ...  
  19.   " 使用FIELD-SYMBOLS获取特定字段中的值  
  20.   CONCATENATE p_variable_name '-' xdetails-name INTO field_name.  
  21.   ASSIGN (field_name) TO <field_value>.  
  22.   CLEAR <field_value>.  
  23. ENDLOOP.  


另外,透明表的结构也可以直接从SAP的一个透明表D0031中获取。

当然除了字段的其他信息就不那么容易得到了。

 

3. 动态获取内表的结构

主要是通过cl_abap_typedescr类的describe_by_data静态方法获取了内表变量的描述信息,然后再调用描述信息的get_table_line_type方法获取单行的类型变量。

下面这个例子是动态获取结构中的各个字段名称、类型、长度及精度信息。

本例子来自:http://www.itpub.net/thread-1039190-1-1.html

[plain]  view plain copy
  1. TYPES: BEGIN OF typ_itab,  
  2.          aaa(20) TYPE c,  
  3.          bbb      TYPE i,  
  4.          ccc      TYPE p LENGTH 12 DECIMALS 3,  
  5.        END OF typ_itab.  
  6.   
  7. DATA: i_itab TYPE TABLE OF typ_itab.  
  8. DATA: l_tabledescr_ref TYPE REF TO cl_abap_tabledescr,  
  9.       l_descr_ref      TYPE REF TO cl_abap_structdescr,  
  10.       wa_table         TYPE abap_compdescr.  
  11.   
  12. l_tabledescr_ref ?= cl_abap_typedescr=>describe_by_data( i_itab ).  
  13. l_descr_ref ?= l_tabledescr_ref->get_table_line_type( ).  
  14.   
  15. LOOP AT l_descr_ref->components INTO wa_table .  
  16.   WRITE :/ wa_table-name,  
  17.            wa_table-type_kind,  
  18.            wa_table-length,  
  19.            wa_table-decimals.  
  20. ENDLOOP.  


4. 其他
可以利用DESCRIBE_BY_OBJECT_REF方法获取对象引用的类型信息。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值