Klassen Cast auf Argumentenklasse via Reflection?

geqoo

Bekanntes Mitglied
Hallo,

ich habe hier mal eine Frage zum Thema Reflection.

Ich habe hier einen Konstruktor:

Java:
public DatenExport (String name, 
  DatenObj jahr,

  DatenObj halbjahr1,
  DatenObj halbjahr2,

  DatenObj q1,
  DatenObj q2,
  DatenObj q3,
  DatenObj q4) {
    // ...
}

Jetzt kann man ja mittels Reflection die Argumente aus dem Konstruktor holen:

Java:
// Konstruktoren holen
Constructor[] constructors = this.getClass().getDeclaredConstructors();
// Argumente holen
Class[] parameterTypes = constructors[0].getParameterTypes();

for (Class param : parameterTypes) {
	// ...
}

Von Seiten der Programmierung ist bekannt, dass alle Objekte nach dem Namen (String) vom Typ "DatenObj" sind. Außerdem sind es recht viele DatenObj-Argumente (ca. 30).

Das Problem was ich jetzt habe ist, dass param immer vom Typ "Class" ist. Ich kann zwar jetzt mit param arbeiten, allerdings keine Methoden der Klasse "DatenObj" aufrufen.

Meine Frage nun: Ist das irgendwie möglich, dass ich das Class-Object von Reflection wieder in den Typ "DatenObj" gecastet bekomme, damit ich wieder Methoden von "DatenObj" aufrufen kann?

Wäre für jede Hilfe dankbar!
 

geqoo

Bekanntes Mitglied
Das habe ich schon probiert.

Java:
for (Class clazz : c[0].getParameterTypes()) {
  if (clazz.getName().endsWith("DatenObj")) {
    DatenObj.class.cast(clazz);
  }
}

Allerdings erhalte ich dann immer diese Fehlermeldung: java.lang.ClassCastException(Unknown source).

Übrigens: Um den Fehler im Design an diesem Konstruktor wollen wir hier mal nicht diskutieren.
Ich weiß, dass es blöd gemacht ist, aber ich muss mich an die Vorgabe halten.
 
Zuletzt bearbeitet:

anti-held

Bekanntes Mitglied
Was willst du eigentlich bewirken?
Per Reflection auf die Membervariablen eines vorhandenen DatenExport - Objekts zugreifen oder
per Reflection ein neues Object vom Typ DatenExport mit vorhandenen DatenObj - Objekten erzeugen.
 

geqoo

Bekanntes Mitglied
Ich möchte auf die Membervariablen vom DatenExport-Objekt zugreifen, so wie sie dem Konstruktor übergeben werden.
 

anti-held

Bekanntes Mitglied
Hier habe ich dir ein kleines Beispiel gemacht für die Reflection

DatenObj Klasse:

Java:
public class DatenObj {
	private String name;

	public DatenObj(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}
	
	@Override
	public String toString() {
		return name;
	}
}

DatenExport Klasse
Java:
import java.lang.reflect.Constructor;

public class DatenExport {

	private String name;
	private DatenObj jahr;
	private DatenObj halbjahr;
	private DatenObj halbjahr1;
	private DatenObj p1;
	private DatenObj p2;
	
	public DatenExport(String name,DatenObj jahr, DatenObj halbjahr, DatenObj halbjahr1, DatenObj p1, DatenObj p2) {
		this.name = name;
		this.jahr = jahr;
		this.halbjahr = halbjahr;
		this.halbjahr1 = halbjahr1;
		this.p1 = p1;
		this.p2 = p2;
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder(name);
		sb.append("\njahr: " + jahr.getName());
		sb.append("\nhalbjahr: " + halbjahr.getName());
		sb.append("\nhalbjahr1: " + halbjahr1.getName());
		sb.append("\np1: " + p1.getName());
		sb.append("\np2: " + p2.getName());
		return sb.toString();
	}
	
}

hier das Reflection zeugs:

Java:
public class Main {

	// bestehende DatenObj daten:
	private static DatenObj[] daten = new DatenObj[] { new DatenObj("obj1"), new DatenObj("obj2"), new DatenObj("obj3"), new DatenObj("obj4"),
			new DatenObj("obj5") };

	public static void main(String... args) throws Exception {

		Constructor[] constructors = DatenExport.class.getDeclaredConstructors();
		Class[] parameterTypes = constructors[0].getParameterTypes();

		// Beispiel für die erstellung eines neuen Objekts
		Object[] params = new Object[6];
		params[0] = "nameDesDatenExportObjects";
		for (int i = 0; i < daten.length; i++) {
			params[i + 1] = daten[i];
		}
		DatenExport datenExportObj = (DatenExport) constructors[0].newInstance(params);
		System.out.println(datenExportObj.toString());

		// Beispiel auf Zugriff auf Membervariablen eines vorhanden Objekts
		for (Field field : datenExportObj.getClass().getDeclaredFields()) {
			field.setAccessible(true);
			System.out.println("Variable " + field.getName() + ": " + field.get(datenExportObj).toString() + "(" + field.getType() + ")");

			Object object = field.get(datenExportObj);

			if(object instanceof DatenObj){
			// Auf Methode von Membervariable zugreifen:
				DatenObj obj = (DatenObj) object;
				System.out.println(obj.getName());
			}
		}
	}
}

Hoffe das beantwortet deine Fragen
 
Zuletzt bearbeitet:

geqoo

Bekanntes Mitglied
Dein Reflection Code ist soweit logisch, aber leider beantwortet der nicht meine Frage.

Ich will die Felder ja gar nicht zuweisen (so wie es in deinem Code der Fall ist), sondern ich möchte mit den übergebenen Argumenten (den DatenObjekten) direkt arbeiten.
 
Zuletzt bearbeitet:

anti-held

Bekanntes Mitglied
Das ist der 2. Teil der main-Methode.
Ab // Beispiel auf Zugriff auf Membervariablen eines vorhanden Objekts.
Am besten schaust du dir die Ausgabe des Codes an, um es zu verstehen.

datenExportObj ist das bereits erstellte Objekt, dessen DatenObj du lesen willst!
mit [c]datenExportObj.class.getDeclaredFields()[/c] erhältst du eine Liste von allen Membervariablen.
In der Schleife iterierst du über alle Felder (Membervariablen).
Da sie private sind, erfolgt erst der Aufruf [c]field.setAccessible()[/c] um darauf zugreifen zu können.
Dann initialisieren wir das aktuelle Objekt der Membervariable von dem datenExportObj mit [c]Object object = field.get(datenExportObj);[/c]
Dann überprüfen wir, ob es sich wirklich um ein DatenObj handelt mit [c]object instanceof DatenObj[/c],
denn die name-Membervariable würde hier false liefern, weil sie ja ein java.lang.String ist.
Mit [c]DatenObj obj = (DatenObj) object;[/c] casten wir es auf ein DatenObj und können dann dessen Methoden aufrufen.
Hier dargestellt durch die Methode [c]obj.getName()[/c] welche ich in der Klasse DatenObj implementiert habe.

Verständlich?
 

geqoo

Bekanntes Mitglied
Ich verstehe schon, was du meinst.

Heißt also, dass es nicht möglich ist, direkt auf die Werte aus dem Aufruf zuzugreifen, sondern man nur über den Zwischenschritt gehen kann, sich die Werte in der Klasse zwischenzuspeichern.

Dann schiebe ich das lieber alles beim Aufruf in eine Liste, dann habe ich das gewünschte Format zum Weiterarbeiten.

Danke erstmal.
 

anti-held

Bekanntes Mitglied
Ah jetzt verstehe ich was du meinst.
Sry!

Du könntest den Konstrutkor so aussehen lassen:

Java:
public DatenExport(String name, DatenObj... params){
   ...
}

dann kannst du so viele DatenObj übergeben, wie du willst
und mit einer for-schleife auf alle DatenObj zugreifen:

Java:
for(DatenObj obj:params){
   obj.tuEtwas();
}
 
Zuletzt bearbeitet:

geqoo

Bekanntes Mitglied
!!!
Sowas wie varargs ist genau der Gedankenblitz, den ich die ganze Zeit gesucht habe!
Die Lösung ist perfekt. Danke. :)
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zeppi Cast Object in Generics Allgemeine Java-Themen 4
Tarrew RMI Java RMI - com.sun.proxy.$Proxy1 cannot be cast to Funktionen Allgemeine Java-Themen 0
M Cast double[]-->Object[] oder Vector<double[]> Allgemeine Java-Themen 3
M Harten Cast vermeiden Allgemeine Java-Themen 7
S Unchecked cast from Component to JComboBox<String> Allgemeine Java-Themen 3
P Reflection "Cast" Allgemeine Java-Themen 5
M cannot be cast to java.lang.Comparable Allgemeine Java-Themen 5
V Gibt es einen Variablen Cast? Allgemeine Java-Themen 8
Z Cast von Long zu Integer funktionert nicht Allgemeine Java-Themen 3
N cast über string Allgemeine Java-Themen 24
C int zu byte cast - verständnis Allgemeine Java-Themen 3
E Heap und Comparable (warning: [unchecked] unchecked cast) Allgemeine Java-Themen 2
MQue cast DefaultMutableTreeNode Allgemeine Java-Themen 2
M Type-Cast Allgemeine Java-Themen 3
G Cast Allgemeine Java-Themen 4
O unchecked cast? Allgemeine Java-Themen 4
S instanceof liefert true, aber cast funktioniert nicht! Allgemeine Java-Themen 6
reibi Unchecked cast Allgemeine Java-Themen 1
T cast Object to Double[] Allgemeine Java-Themen 2
G Trotz Generics Cast-Fehler! Allgemeine Java-Themen 5
G Object cast via Reflection Allgemeine Java-Themen 8
R cast Integer[] zu int[] Allgemeine Java-Themen 2
G Cast von String zu Enumeration Allgemeine Java-Themen 2
N Warning "The Cast from Object to" Allgemeine Java-Themen 9
D Cast schlägt fehl : Object[] zu Button[] Allgemeine Java-Themen 2
Y unnecessary cast & Performance Allgemeine Java-Themen 29
B unchecked cast Error Allgemeine Java-Themen 2
K Cast ohne neues Object zu erzeugen Allgemeine Java-Themen 12
D Cast Exeption Allgemeine Java-Themen 4
T JNI: jcharArray: warning: cast to pointer from integer of. Allgemeine Java-Themen 5
K Cast von Properties und Hashmap Allgemeine Java-Themen 9
E NumberFormatException bei cast auf double Allgemeine Java-Themen 5
H [unchecked] unchecked cast Problem Allgemeine Java-Themen 5
B Reflection gone wrong? Allgemeine Java-Themen 21
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
J Reflection Aufruf: .class durch .dll ersetzen Allgemeine Java-Themen 4
T Reflection - Abprüfen von Klasseneigenschaften Allgemeine Java-Themen 3
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
J Reflection-Method Hook? Allgemeine Java-Themen 14
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
X public Getter ersetzen (Reflection?!) Allgemeine Java-Themen 3
A Reflection Problem Allgemeine Java-Themen 15
K Generic class und Reflection Allgemeine Java-Themen 2
G SecurityManager/Policy-File/Reflection Allgemeine Java-Themen 0
N Per Reflection auf (method) local inner class zugreifen? Allgemeine Java-Themen 3
E Reflection? Frage Allgemeine Java-Themen 4
B Reflection, invoke dynamisch befüllen Allgemeine Java-Themen 3
T Reflection Allgemeine Java-Themen 11
H Collections Generics und Reflection Allgemeine Java-Themen 6
TheWhiteShadow Reflection-Lösung für Objektkopien Allgemeine Java-Themen 3
B Reflection: getMethods schlägt fehl (NoClassDefFoundE)) Allgemeine Java-Themen 15
D Reflection-Performance Allgemeine Java-Themen 7
S Reflection und Generic Allgemeine Java-Themen 9
W Reflection -> getMethod bei optionalen Parametern Allgemeine Java-Themen 4
Kr0e Reflection - Instanz einer Klasse erstellen, ohne Default-Constructor Allgemeine Java-Themen 15
C Probleme mit dem Zugriff auf private Methode per reflection Allgemeine Java-Themen 2
C Zugriff auf private Methode per reflection geht nicht mehr Allgemeine Java-Themen 3
M Probleme mit Reflection Allgemeine Java-Themen 10
A Reflection Konstruktor Parameter Supertyp Allgemeine Java-Themen 2
D Vererbung, Reflection und automatischer Methodenaufruf Allgemeine Java-Themen 24
G Java Reflection Allgemeine Java-Themen 11
N Reflection: NoSuchMethodException obwohl Methode existiert Allgemeine Java-Themen 2
brunothg Problem mit Reflection Allgemeine Java-Themen 6
M reflection in inner classes Allgemeine Java-Themen 7
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
V Reflection - Field-Instanz und Annotations Allgemeine Java-Themen 6
Y Reflection und "extends" Schlüsselwort Allgemeine Java-Themen 3
R Reflection Problem Allgemeine Java-Themen 4
N getName() of reflection Object Allgemeine Java-Themen 4
P Reflection - Wie rufe ich die Felder einer Klasse in einer Methode der Basisklasse? Allgemeine Java-Themen 4
M Reflection Queue auslesen Allgemeine Java-Themen 6
N generic reflection Allgemeine Java-Themen 5
megachucky Java Reflection -> versteckte Felder finden? Allgemeine Java-Themen 3
MQue Reflection Exception Allgemeine Java-Themen 11
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
ruutaiokwu Per Reflection membervariablen überschreiben / zuweisen / nullen Allgemeine Java-Themen 5
T Zugriff per Reflection o.ä. möglich? Allgemeine Java-Themen 18
R Reflection: Membervariablen-Initialwerte Allgemeine Java-Themen 4
G Reflection Allgemeine Java-Themen 6
V reflection in java 5 und 6 Allgemeine Java-Themen 2
C Reflection Übergabeparamter überprüfen? Allgemeine Java-Themen 3
Ark Konstruktor per Reflection nicht bekannt Allgemeine Java-Themen 4
Q Objekte durch Reflection erzeugen Allgemeine Java-Themen 18
G [Reflection + WebService] Methodenaufruf an einem Proxy Allgemeine Java-Themen 11
T Parameternamen mit Reflection-API Allgemeine Java-Themen 14
M reflection mit parametern Allgemeine Java-Themen 8
M Reflection Frage Allgemeine Java-Themen 7
G Code vereinfachen bei Reflection Allgemeine Java-Themen 4
I reflection get inner static classes Allgemeine Java-Themen 2
C Reflection Allgemeine Java-Themen 12
Y Reflection - wie kann ich eine Methode benutzen Allgemeine Java-Themen 4
Y Reflection - wie anwenden/benutzen bei folgendem Problem Allgemeine Java-Themen 3
P Java Reflection API - ResultDataModel ? Allgemeine Java-Themen 3
R Object Dynamisch erzeugen (Reflection API) Allgemeine Java-Themen 22
N Design-Frage: persistent machen per Reflection Allgemeine Java-Themen 3
G Reflection: aktuelle bzw umschliessende Methode? Allgemeine Java-Themen 7
G per Reflection auf private Klassenattribute zugreifen? Allgemeine Java-Themen 9
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
M per reflection private attributsnamen auslesen Allgemeine Java-Themen 3
G Interface - Klassen implementieren das - Reflection ok? Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben