类CL_ABAP_TYPEDESCR,动态取得运行时类型

有时候我们要在程序运行的时候取得某个内表或者某个结构它的属性或者它的字段的属性,可能通过类CL_ABAP_TYPEDESCR和它的子类取得指定内表的属性。
类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、

例1:

REPORT  ZTEST_UPEXCEL.

DATA:
name(10) TYPE c,

*WA_DEPT TYPE TYP_DEPT,

DESCR_REF TYPE REF TO CL_ABAP_TYPEDESCR.

FIELD-SYMBOLS:

<FS_DEPT> TYPE ABAP_COMPDESCR.

************************************************************************

* START-OF-SELECTION

************************************************************************

START-OF-SELECTION.

DESCR_REF ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_data( name ).

BREAK-POINT.

例2:

 1 TYPES:
 2   my_table TYPE HASHED TABLE OF i WITH UNIQUE KEY TABLE LINE.
 3 DATA:
 4   descr_ref TYPE ref to cl_abap_tabledescr.
 5 FIELD-SYMBOLS:
 6   <key_comp_wa> TYPE abap_keydescr.
 7 START-OF-SELECTION.
 8   descr_ref ?= cl_abap_typedescr=>describe_by_name( ‘MY_TABLE‘ ).
 9   WRITE: / ‘Typename      :‘, descr_ref->absolute_name.
10   WRITE: / ‘Kind          :‘, descr_ref->type_kind.
11   WRITE: / ‘Length        :‘, descr_ref->length.
12   WRITE: / ‘Decimals      :‘, descr_ref->decimals.
13   WRITE: / ‘Table Kind    :‘, descr_ref->table_kind.
14   WRITE: / ‘Initial Size  :‘, descr_ref->initial_size.
15   WRITE: / ‘Key Def Kind  :‘, descr_ref->key_defkind.
16   WRITE: / ‘Has Unique Key:‘, descr_ref->has_unique_key.
17   WRITE: / ‘Key Components:‘.
18   LOOP AT descr_ref->key ASSIGNING <key_comp_wa>.
19     WRITE <key_comp_wa>-name.
20   ENDLOOP.

例3:

 1 TYPES:
 2
 3 BEGIN OF TYP_DEPT,
 4
 5 ID(10) TYPE N,
 6
 7 NAME(10) TYPE C,
 8
 9 END OF TYP_DEPT.
10
11 DATA:
12
13 WA_DEPT TYPE TYP_DEPT,
14
15 DESCR_REF TYPE REF TO CL_ABAP_STRUCTDESCR.
16
17 FIELD-SYMBOLS:
18
19 <FS_DEPT> TYPE ABAP_COMPDESCR.
20
21 ************************************************************************
22
23 * START-OF-SELECTION
24
25 ************************************************************************
26
27 START-OF-SELECTION.
28
29 DESCR_REF ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( WA_DEPT ).
30
31 LOOP AT DESCR_REF->COMPONENTS ASSIGNING <FS_DEPT>.
32
33 WRITE: / <FS_DEPT>-NAME.
34
35 ENDLOOP.

时间: 2024-08-27 15:37:03

类CL_ABAP_TYPEDESCR,动态取得运行时类型的相关文章

C++杂记:运行时类型识别(RTTI)与动态类型转换原理

运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast. 1. typeid操作符的实现 1.1. 静态类型的情形 C++中支持使用typeid关键字获取对象类型信息,它的返回值类型是const std::type_info&,例: #include <typeinfo> #include <cassert> struct B {} b, c; struct D : B {

【转载】C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理

原文:C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理 运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast. 1. typeid操作符的实现 1.1. 静态类型的情形 C++中支持使用typeid关键字获取对象类型信息,它的返回值类型是const std::type_info&,例: #include <typeinfo> #include <cassert>

C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理

运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast. 1. typeid操作符的实现 1.1. 静态类型的情形 C++中支持使用typeid关键字获取对象类型信息,它的返回值类型是const std::type_info&,例: #include <typeinfo> #include <cassert> struct B {} b, c; struct D : B {

MFC 六大机制 (2) RTTI(运行时类型识别)

RTTI(Runtime Type Identification,运行时类型识别) 程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型.MFC 早在编译器支持 RTTI 之前,就具有了这项能力.承接上一章,我们现在要在 Console 程序中将 RTTI 仿真出来.我希望我的类库具备 IsKindOf() 的能力,能够在执行器检查某个对象是否"属于某种类",并传回 TRUE 或 FALSE.为了更直观地查看结果,我在 IsKindOf() 中加入了输出,使其达到如

C++ Primer 学习笔记_101_特殊工具与技术 --运行时类型识别

h2.western { font-family: "Liberation Sans",sans-serif; font-size: 16pt; }h2.cjk { font-family: "微软雅黑"; font-size: 16pt; }h2.ctl { font-family: "AR PL UMing CN"; font-size: 16pt; }h1 { margin-bottom: 0.21cm; }h1.western { fon

MFC六大核心机制之二:运行时类型识别(RTTI)

上一节讲的是MFC六大核心机制之一:MFC程序的初始化,本节继续讲解MFC六大核心机制之二:运行时类型识别(RTTI). typeid运算子 运行时类型识别(RTTI)即是程序执行过程中知道某个对象属于某个类,我们平时用C++编程接触的RTTI一般是编译器的RTTI,即是在新版本的VC++编译器里面选用“使能RTTI”,然后载入typeinfo.h文件,就可以使用一个叫typeid()的运算子,它的地位与在C++编程中的sizeof()运算子类似的地方(包含一个头文件,然后就有一个熟悉好用的函数

RTTI (Run-Time Type Identification,通过运行时类型识别) 转

参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. RTTI提供了以下两个非常有用的操作符: (1)typeid操作符,返回指针和引用所指的实际类型: (2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用. 面向对象的编程语言,象C++,Java,delphi都提供了对RTTI的支持. 本文将简略介绍 RTTI 的一些背景知识.描述 R

Java 笔记(四) RTTI - 运行时类型检查

运行时类型检查,即Run-time Type Identification.这是Java语言里一个很强大的机制,那么它到底给我们的程序带来了什么样的好处呢? 在了解运行时类型检查之前,我们要首先知道另一个密切相关的概念,即运行时类型信息(Run-time Information - 也可以缩写为RTTI) 运行时类型信息使得你可以在程序运行时发现和使用类型信息. 来自:<Thinking in Java>. OK,那么我们总结来说,RTTI就是能够让我们在程序的运行时去获取类型的信息.接下来我

C++学习之显示类型转换与运行时类型识别RTTI

static_cast const_cast reinterpret_cast 运行时类型识别(RTTI) dynamic_cast 哪种情况下dynamic_cast和static_cast使用的情况一样? 什么情况下使用dynamic_cast代替虚函数? typeid 命名的强制类型转换形式如下: cast_name<type>(expression); 其中:cast_name指static_cast.dynamic_cast.const_cast.reinterpret_cast中的