Klassenname eines initialen Objektes/Referenz

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
7 Beiträge • Seite 1 von 1
7 Beiträge Seite 1 von 1

Klassenname eines initialen Objektes/Referenz

Beitrag von John_ (ForumUser / 3 / 0 / 0 ) »
Hallo Ihr Lieben,

gibt es eine Möglichkeit mittels RTTI oder anderen Möglichkeiten den Klassennamen eines Objektes auszulesen sofern das Objekt INITIAL ist ?
Das dynamische Auslesen von Eigenschaften ist einfach für Objekte die bereits instanziiert ist (cl_abap_...descr etc.).
Nur habe ich bisher keine Möglichkeit gefunden den Klassenname eines Objektes bzw. weitere Meta-Informationen für INITIALE Objekte auszulesen.

Hintergrund ist folgender: Ich möchte eine Exception werfen, sofern ein Objekt initial ist. Dieser Exception möchte ich jedoch nen Namen des Typs (Klassenname) von eigentlich ein Objekt erwartet wird mitgeben. Dies macht die Fehlersuche später einfacher, wie wenn ich nur einfach eine Exception "Referenz ist initial" werfe.

BSP:
DATA:
lr_describer TYPE REF TO cl_abap_typedescr,
lr_xyz TYPE REF TO cl_xyz,
lv_cls_absolute_name TYPE ABAP_ABSTYPENAME.


lr_describer = cl_abap_refdescr=>describe_by_object_ref( lr_xyz ).
lv_cls_absolute_name = lr_describer->ABSOLUTE_NAME.

ist der Absolute Name nicht \CLASS=cl_xyz sondern TYPE=_%...

Über Hinweise würde ich mich sehr freuen.

Danke.

John

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Klassenname eines initialen Objektes/Referenz

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
hi!

Initialie Objekte haben *NICHTS* was man auslesen könnte. Sind ja auch nur Zeiger.
Die Typdefinition die du im Sourcecode hinterlegt hast ist grob gesagt nur für die Syntaxprüfung relevant, zur Laufzeit wird das ignoriert!
Versuchs doch einfach ander herum: Gib den NAMEN der VARIABLEN aus der fehlerhaft ist!

uU kannst das Ganze noch mit der Aufrufposition "würzen":

Code: Alles auswählen.

data:
  LT_STACK type ABAP_CALLSTACK.

field-symbols:
  <ls_stack> type ABAP_CALLSTACK_LINE.

call function 'SYSTEM_CALLSTACK'
   EXPORTING
     MAX_LEVEL          = 1
   importing
     CALLSTACK          = LT_STACK.

read table LT_STACK assigning <ls_stack> index 1.
if sy-subrc eq 0.
  ...
endif.
lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Klassenname eines initialen Objektes/Referenz

Beitrag von John_ (ForumUser / 3 / 0 / 0 ) »
Hallo adt,

vielen Dank für die Antwort. Der Vorschlag ist sehr gut!

Die beschriebene Funktionalität geht soweit. Nur erhalte weiß ich nicht, wie ich auf den Namen der Variablen zugreifen soll ?
Der Callstack liefert mir nur die Position im Quelltext, aber nicht den Namen der Variable.

Vielen Dank.

John

Re: Klassenname eines initialen Objektes/Referenz

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
hi!

Du wirst ja wohl hoffentlich den Namen deiner Variablen wissen oder? :(

Code: Alles auswählen.

if lr_test is not bound.
  raise exception type ZCX_REF_INITIAL exporting ID_NAME = "LR_TEST".
endif.
Und wenn du ein fauler bist so wie ich, machst ein Macro dafür

Code: Alles auswählen.

define CHECK_BOUND.
  if &1 is not bound.
    raise exception type ZCX_REF_INITIAL exporting ID_NAME = "&1".
  endif.
end-of-definition.

CHECK_BOUND: lr_test, lr_test02, lr_test03.
Die Stackabfrage hab ich nur dazu vorgeschlagen, wenn du z.B. eine Meldung augeben willst die etwas sprechender ist. (z.B. für ein Logging).
Grundsätzlich ist die Quelltextposition bereits in jeder Exception vorhanden, aber eben nur in einer "internen" Darstellung die ich bislang noch nicht wirklich verstanden habe :oops:

lg ADT

EDIT:
Mistige Codedarstellung:
&1 sollte &1 sein
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Klassenname eines initialen Objektes/Referenz

Beitrag von black_adept (Top Expert / 4089 / 127 / 940 ) »
Hallo John_,

ich glaube du beginnst mit der falschen RTTI-Methode.
Da du ja schon weißt, dass es sich um eine Referenz auf ein Objekt (hier eine Klasse auch wenn sie nicht instanziiert sein sollte) handelt solltest du auch die entsprechende RTTI-Version verwenden.

Probier doch mal die folgende Kette:

Code: Alles auswählen.

 ...
lr_describer     TYPE REF TO cl_abap_typedescr,
lr_describer_ref TYPE REF TO cl_abap_refdescr,   " Beschreibung der Referenz
...

  lr_describer_ref ?= cl_abap_typedescr=>describe_by_data( lr_xyz ).
  lr_describer = lr_describer_ref->get_referenced_type( ).

lv_cls_absolute_name = lr_describer->absolute_name.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Klassenname eines initialen Objektes/Referenz

Beitrag von John_ (ForumUser / 3 / 0 / 0 ) »
Hallo,

vielen Dank für die Antworten. Besonders die Letzte von black_adept ist wunderbar! Warum ich da selber nicht drauf gekommen bin...
Naja. Zumindest kann man so wunderbar den Typ der Referenz auslesen, den sie angenommen hätte, wenn das Objekt denn instanziiert worden wäre.

Nun gibt es allerdings noch einen Haken. :D

Will man das ganze nun in eine Raise-Exception-Methode packen, die die initiale Referenz übergeben bekommt, den Typ wie im vorigen Post raussucht und bspw. eine Execption 'Paramter vom Typ XYZ ist initial' wirft, wird das schwierig. Denn man kann den Übergabeparameter dieser Raise Methode nicht vom allg. Typ Object haben. Denn dann wird logischerweise nicht der korrekt referenzierte Typ XYZ sondern Object "gefunden".

bsp.:
Klasse
Z_CL_RAISER
statische Methode:
Raise_initial_xyz: Import: ir_xyz type Object. (Sucht über RTTI den typ und wirft Exception)

Aufruf:

DATA: lr_xyz type ref to z_cl_xyz.
Z_CL_RAISER=>RAISE_initial_XYZ( lr_xyz )

würde in diesem Fall als typ "OBJECT" finden und nicht "Z_CL_XYZ), da der Parameter generisch ist.

Heißt, ich müsste für jeden Typ eine extra Raise-Methode impl. oder den Typ vorher rausfinden, was jedoch haufen zusätzlicher Code ist, der eigentlich je weiterem Typ gleich wäre.

hm...

Re: Klassenname eines initialen Objektes/Referenz

Beitrag von black_adept (Top Expert / 4089 / 127 / 940 ) »
John_ hat geschrieben: Denn man kann den Übergabeparameter dieser Raise Methode nicht vom allg. Typ Object haben.
Du willst ja auch gar kein allgemeines Objekt übergeben sondern eine Referenz auf ein ebensolches. Und den Übergabeparameter der Raise-Methode vom Typ "REF TO OBJECT" zu deklarieren sollte durchaus möglich sein. Und da du zur Laufzeit dann ja eine ausgeprägte Referenz hast, sollte dann auch wieder der korrekte Klassenname gefunden werden können.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Seite 1 von 1

Vergleichbare Themen

3
Antw.
3489
Views
Referenz-Tabelle UND Referenz-Feld f.BRGEW und NTGEW
von bohne » 22.02.2007 10:52 • Verfasst in ABAP® für Anfänger
2
Antw.
6571
Views
Referenz-Tabelle und Referenz-Feld
von dyv » 28.08.2014 15:25 • Verfasst in ABAP® für Anfänger
0
Antw.
935
Views
Fuba um Status eines Objektes (Account&Products) umzusetzen
von kleiner » 20.01.2009 14:16 • Verfasst in ABAP® Core
2
Antw.
1792
Views
Referenz auf eingebauten Typ (per FB)
von gs3rr4 » 30.08.2016 17:27 • Verfasst in ABAP® Core
2
Antw.
2413
Views
Dynamische Referenz
von sapnup » 24.10.2016 13:07 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Dialog-Container mit Toolbar/Status
vor 14 Stunden von DeathAndPain gelöst 22 / 3183
Daten an Tabelle binden
vor 18 Stunden von Lukas Sanders 2 / 1048
Zeilenumbrüche ersetzen
vor 2 Tagen von ralf.wenzel 6 / 618

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Dialog-Container mit Toolbar/Status
vor 14 Stunden von DeathAndPain gelöst 22 / 3183
Daten an Tabelle binden
vor 18 Stunden von Lukas Sanders 2 / 1048
Zeilenumbrüche ersetzen
vor 2 Tagen von ralf.wenzel 6 / 618

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2612
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9201