有没有办法在没有 getter 的情况下获取对象私有属性的值。不允许以任何形状或形式修改类。
请在下面找到一个带有私有属性的示例类。
CLASS counter DEFINITION.
PUBLIC SECTION.
METHODS: set IMPORTING value(set_value) TYPE i.
PRIVATE SECTION.
DATA count TYPE i.
ENDCLASS. "counter DEFINITION
CLASS counter IMPLEMENTATION.
METHOD set.
count = set_value.
ENDMETHOD. "set
ENDCLASS. "counter IMPLEMENTATION
如何获取count
值?从计数器继承将不起作用,因为count
是私有的,不受保护。
不幸的是,我没有,我自己以许多不同的方式尝试过,但没有一种有效:
- 具有标准超类 - 超类无法访问
动态子类的私有属性 - 创建子类将永远不起作用,因为它只能访问受保护的
- 尝试使用单元测试框架不起作用。我试图调用允许访问私有数据但不允许访问的内核模块利用。
你基本上运气不好。不过,有一个晦涩的选项,具体取决于您尝试访问的类。某些类将接口指定为友元,如果您实现该接口,则可以访问它们的私有数据(7.20 上的 ALV 就是这样),但不幸的是,这仅在少数有限的情况下有效。
运行时类型服务相当于 abap 的反射。它们允许您几乎扫描每个对象,并且大多数情况下甚至可以在运行时对其进行修改。据我所知,属性的可见性无关紧要。但要小心。并阅读各种类,因为有很多类,每个类都指定用于处理特殊类型的dataopbject(结构,对象等)
http://wiki.scn.sap.com/wiki/pages/viewpage.action?pageId=42965
你可以创建一个子类,重新实现 setter 并设置第二个变量,然后调用父方法。请注意有两个变量持有相同内容的后果......请查看 vwegert 的评论,看看你是否真的想要,因为这通常不是一个好主意,而且它违反了 OO 的规则。
CLASS counter_sub DEFINITION INHERITING FROM counter.
PUBLIC SECTION.
data count2 type i read-only.
METHODS: set REDEFINITION.
ENDCLASS. "counter_sub DEFINITION
CLASS counter_sub IMPLEMENTATION.
METHOD set.
count2 = set_value.
super->set( set_value ).
ENDMETHOD. "set
ENDCLASS. "counter_sub IMPLEMENTATION