如何在ABAP中读取没有getter的对象的私有属性

时间:2013-10-03 06:59:50

标签: abap

有没有办法在没有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是私有的,不受保护。

3 个答案:

答案 0 :(得分:2)

不幸的是,我自己尝试过很多种不同的方法:

  • 拥有标准的超级班级 - 超级班级无法访问 动态子类的私有属性
  • 制作子类永远不会有效,因为它只能访问受保护的
  • 尝试使用单元测试框架不起作用。我试过了 调用允许访问私有数据但不允许访问私有数据的内核模块 果。

你基本上没有运气。根据您尝试访问的课程,有一个不起眼的选项。有些类具有指定为朋友的接口,如果您实现该接口,则可以访问其私有数据(7.20上的ALV就是这样)但不幸的是,这仅适用于少数几种情况。

答案 1 :(得分:1)

运行时类型服务是abap相当于反射。 它们允许您几乎扫描每个对象,甚至在运行时甚至修改它。据我所知,属性的可见性无关紧要。不过要小心。 并阅读各种类,因为有很多,每个指定工作在一个特殊类型的dataopbject(结构,对象等)

http://wiki.scn.sap.com/wiki/pages/viewpage.action?pageId=42965

答案 2 :(得分:0)

您可以创建一个子类,重新实现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