ABAP RTTI(Run Time Type Identification)介绍与反射机制
2013-06-21 15:27
369 查看
RTTI运行时类型识别 即Run Time Type Identification的简称,是ABAP
OO中引入的概念。它可以应用于所有的ABAP类型,所以DESCRIBE FIELD,DESCRIBE TABLE可以被替代。对于不同的类型都有不同的描述类,为了得到一个类型的description object你必须使用CL_ABAP_TYPEDESCR的静态方法来得到相应的description
class。在runtime中,每一个类型只有一个description object。
原文地址:http://www.chiefsailor.net/blog/2011/04/sap-abap-reflection/
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
plaincopy
*" ------------------------------------------------------- "*
*" p_variable_name 为结构的变量名
*" p_strtuct_name 为结构名称
*" field_name 为一字符串,用于为FIELD-SYMBOLS拼出变量名
*" <field_value> 指针
*" ------------------------------------------------------- "*
DATA : idetails TYPE abap_compdescr_tab,
xdetails TYPE abap_compdescr.
ref_table_des TYPE REF TO cl_abap_structdescr.
FIELD-SYMBOLS <field_value> .
" 根据结构名p_strtuct_name获取结构描述信息
ref_table_des ?= cl_abap_typedescr=>describe_by_name( p_strtuct_name ).
" 从结构描述信息中获取字段列表
idetails[] = ref_table_des->components[].
LOOP AT idetails INTO xdetails.
...
" 使用FIELD-SYMBOLS获取特定字段中的值
CONCATENATE p_variable_name '-' xdetails-name INTO field_name.
ASSIGN (field_name) TO <field_value>.
CLEAR <field_value>.
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
plaincopy
TYPES: BEGIN OF typ_itab,
aaa(20) TYPE c,
bbb TYPE i,
ccc TYPE p LENGTH 12 DECIMALS 3,
END OF typ_itab.
DATA: i_itab TYPE TABLE OF typ_itab.
DATA: l_tabledescr_ref TYPE REF TO cl_abap_tabledescr,
l_descr_ref TYPE REF TO cl_abap_structdescr,
wa_table TYPE abap_compdescr.
l_tabledescr_ref ?= cl_abap_typedescr=>describe_by_data( i_itab ).
l_descr_ref ?= l_tabledescr_ref->get_table_line_type( ).
LOOP AT l_descr_ref->components INTO wa_table .
WRITE :/ wa_table-name,
wa_table-type_kind,
wa_table-length,
wa_table-decimals.
ENDLOOP.
4. 其他
可以利用DESCRIBE_BY_OBJECT_REF方法获取对象引用的类型信息。
OO中引入的概念。它可以应用于所有的ABAP类型,所以DESCRIBE FIELD,DESCRIBE TABLE可以被替代。对于不同的类型都有不同的描述类,为了得到一个类型的description object你必须使用CL_ABAP_TYPEDESCR的静态方法来得到相应的description
class。在runtime中,每一个类型只有一个description object。
原文地址:http://www.chiefsailor.net/blog/2011/04/sap-abap-reflection/
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
plaincopy
*" ------------------------------------------------------- "*
*" p_variable_name 为结构的变量名
*" p_strtuct_name 为结构名称
*" field_name 为一字符串,用于为FIELD-SYMBOLS拼出变量名
*" <field_value> 指针
*" ------------------------------------------------------- "*
DATA : idetails TYPE abap_compdescr_tab,
xdetails TYPE abap_compdescr.
ref_table_des TYPE REF TO cl_abap_structdescr.
FIELD-SYMBOLS <field_value> .
" 根据结构名p_strtuct_name获取结构描述信息
ref_table_des ?= cl_abap_typedescr=>describe_by_name( p_strtuct_name ).
" 从结构描述信息中获取字段列表
idetails[] = ref_table_des->components[].
LOOP AT idetails INTO xdetails.
...
" 使用FIELD-SYMBOLS获取特定字段中的值
CONCATENATE p_variable_name '-' xdetails-name INTO field_name.
ASSIGN (field_name) TO <field_value>.
CLEAR <field_value>.
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
plaincopy
TYPES: BEGIN OF typ_itab,
aaa(20) TYPE c,
bbb TYPE i,
ccc TYPE p LENGTH 12 DECIMALS 3,
END OF typ_itab.
DATA: i_itab TYPE TABLE OF typ_itab.
DATA: l_tabledescr_ref TYPE REF TO cl_abap_tabledescr,
l_descr_ref TYPE REF TO cl_abap_structdescr,
wa_table TYPE abap_compdescr.
l_tabledescr_ref ?= cl_abap_typedescr=>describe_by_data( i_itab ).
l_descr_ref ?= l_tabledescr_ref->get_table_line_type( ).
LOOP AT l_descr_ref->components INTO wa_table .
WRITE :/ wa_table-name,
wa_table-type_kind,
wa_table-length,
wa_table-decimals.
ENDLOOP.
4. 其他
可以利用DESCRIBE_BY_OBJECT_REF方法获取对象引用的类型信息。
相关文章推荐
- 行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制 多态 类加载
- 从头认识java-12.1 为什么需要RTTI(Run-Time Type Identification)?
- RTTI的魅力(运行时类型识别 Run-time type Identification)
- RTTI(Run-time Type Identification)
- c++模拟MFC中运行时类型识别(RTTI)(Run-Time Type Identification)
- RTTI (Run-Time Type Identification,通过运行时类型识别)
- 迷思微软两大框架的RTTI(Run-Time Type Identification)
- RTTI(Run-Time Type Identification)
- [书摘]Issues about RTTI (Run Time Type Identification)
- RTTI(Run-Time Type Identification)、虚函数和虚基类的实现方式、开销分析及使用指导
- RTTI(Run-Time Type Identification,通过运行时类型识别)
- Lession 26 RTTI (Run Time Type Identification)
- The C++ Standard Library: RTTI(Run-Time Type Identification,运行时类型识别)
- 从头认识java-12.1 为什么需要RTTI(Run-Time Type Identification)?
- Advanced Run Time Type Identification in C++ Part II(Property Library An Implementation of RTTI in C++)
- C++ Run-Time Type Identification(RTTI)运行时类型识别
- C++中的Run Time Type Identification
- [Topic]Advanced Run Time Type Identification in C++
- RTTI(Run-Time Type Information,通过运行时类型信息) 运行期类型检查
- Run-time type information--RTTI