云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

分布式数据库_北京品牌网站建设_安全稳定

小七 141 0

ABAP的反射(和/或类型反射)功能主要由CL\u ABAP\uxdescr类和descripe语句组成。例如,为了获取类的信息,您可能会看到这样的代码:

如果您在其他语言中使用过反射,那么您可能也熟悉这段代码,相同的原理只是不同的API和语言:

与ABAP代码相比的区别之一是,您可以获得类的description对象,而不必使用带有类名的文本。这在客观上是更好的,因为以下原因:

编译时安全:如果类不存在,代码就不会编译静态用法分析:Where Used List功能还可以找到这些用法重构:如果类名被更改,IDE重构支持将(由于静态使用分析)找到这些代码行,并在那里提供更改名称的功能。如果你决定反对它,因为编译时的安全,你的代码将不会编译。

使用ABAP例子,如果类不存在或被重命名,大数据的现状,你将不幸地得到运行时错误(除非你捕捉到异常)。由于Eclipse中的ABAP是一种东西,因此比ABAP工作台中有更多的重构功能可用。所以我认为,如果可能的话,避免这些动态运行时用法比以往任何时候都重要。因此,让我们尝试获取一个CL\u ABAP\u CLASSDESCR实例,计算机大数据,在该实例中,使用重构帮助重命名类不会导致运行时错误。

为了避免文本,类名需要用不带引号的代码编写,服务器云,并且仍然可以编译。我能想到的只有几个可能的选择:

其中1个。没有帮助,因为它只会产生逻辑值2。没有帮助,因为我们要分析的类可能根本不可实例化(或者从我们的位置),6。没有帮助和3,4,和5。可能。

第一种方法(可能更好一点)是将文本提取为常量,理想情况下是直接放入类中,这样如果类名应该更改,您至少(应该)只有一个其他位置也可以更改它。这看起来像这样:

祝你好运重新定义子类中的常量…

我个人最喜欢的方法是使用选项3:

对于正确类型的nullpointer伪变量,你可以使用RTTI API的descripe\u by\u data方法,导航并向类描述符投射。必须指出的是,descripe\u by\u object\u ref不起作用,因为你需要一个类的实例(REFERENCE\u是\u INITIAL-exception),所以你需要绕道使用cl\u abap\u refdescr.

4和5以类似的方式工作,我发现类型很有趣,因为您定义了一个引用类型,可以由VALUE inline语句使用。

很遗憾,我想不出一种方法,不使用7.40 inline magic的某种helper声明。以下是所有与兼容重构相关的方法:

这些方法确实给代码增加了相当多的复杂性,因此它们是Z-reflection助手类的理想候选对象。

您可能会或不会偶然发现的另一项任务是在运行时动态获取实例或类成员的值。通常的方法是:

再深入一点,您可能会考虑开发一个库来处理类实例的成员变量(如验证或序列化…)。一种方法可能是这样的:

虽然这已经很好地工作了,但我们的代码中仍然有一个标识符的文本。这将导致ASSERT的断言错误,如果成员标识符被更改,而文本没有被更改,那么重构实用程序就不能静态地找到这个用法。

在C语言中,数据中心解决方案,有一个语句可以避免这个问题,叫做nameof(documentation)。C#特别需要它,因为XAML/中的数据绑定使用MVVM模式。

在ABAP中没有我知道的这样的语句。但你可以利用一个漏洞:在比较类型兼容的数据引用变量(类型REF TO data)时,如果逻辑表达式指向相同的数据对象(源),则逻辑表达式为true。因此,我们可以将一个类的所有成员变量与给定的变量进行比较,如果表达式为真,那么就是搜索的成员。翻译成上面的例子:

如果你把这个功能提取到一个助手方法中,它看起来并不坏:

但是如果有很多成员变量要处理,你会损失很多性能,所以如果你决定使用这样的策略,你可能还想缓存结果以便重用讨论了这两种情况的小助手类。它可能不会考虑所有的边缘情况,个人如何建站,所以如果您想使用它,可以根据需要进行调整。