PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java Reflection - dynamische Variablenbezeichnung ?


Tiamat
2010-03-08, 18:26:20
Hi,

Ist es mit Java-Reflection möglich, Variablenbezeichnungen auch dynamisch zu vergeben. Hab mir eben mal den Teil aus Java ist eine Insel angeschaut, aber nichts dazu gefunden. Ich hab so ne leise Ahnung dadurch, dass es wohl nicht möglich ist, sondern hätte man das sicher erwähnt, aber ich möchte mich trotzdem noch mal erkundigen.
Kennt sich da jemand von euch aus ?

Vielen Dank schonmal

Gruß
Tiamat

Gast
2010-03-08, 23:23:19
Ich weiß nicht, ob es möglich ist, aber ich bin mir zu 99% sicher, dass du dich hier auf dem Holzweg befindest und eine bessere Lösung möglich wäre.

Der_Donnervogel
2010-03-09, 00:50:20
Vermutlich stehe ich nur etwas auf dem Schlauch, aber ich verstehe nicht ganz was gewollt ist. Ist mit "Variable" ein Attribut gemeint? Man kann auf Attribute dynamisch zugreifen:
private int testInt = 5;
public String testString = "Hallo";

public void test() throws IllegalArgumentException, IllegalAccessException {
for (Field f : getClass().getDeclaredFields()) {
if (f.getType().isInstance(new String())) {
System.out.println("String " + f.getName() + ": " + f.get(this));
} else {
System.out.println("int " + f.getName() + ": " + f.getInt(this));
}
}
}

... oder soll etwa dynamisch eine Klasse erzeugt, bzw. der Klasse Attribute hinzugefügt werden? Ich habe so etwas erst ein mal gesehen und das ist schon eine Weile her. Da wurde so viel ich mich erinnere etwas getrickst. Es wurde jeweils der Code für eine neue Klasse dynamisch erzeugt, compiliert und dann die Klasse per forName() eingeladen.

Shink
2010-03-09, 07:36:31
... oder soll etwa dynamisch eine Klasse erzeugt, bzw. der Klasse Attribute hinzugefügt werden?
Das geht mit Reflection nicht. Was du willst ist Bytecode Manipulation.

RattuS
2010-03-09, 19:58:06
Dynamische Programmlogik? Ich denke nicht.

Tiamat
2010-03-10, 07:21:16
Ich hab mir mal den Java Disassembler angeschaut.
Der kann die Bezeichner des früheren Quelltexts auch nicht wiederherstellen.

Naja an der Funktionalität ändert sich wegen der Bezeichnung ja sowieso nichts, aber hätte enorm zur Codequalität, Nachvollziehbarkeit und zum Debuggen beigetragen. Dann eben auf die harte Tour ^^

Gruß
Tiamat

Shink
2010-03-10, 07:51:54
Dann eben auf die harte Tour ^^
Naja. So hart find ich das gar nicht.
Sieh dir mal Javassist an:
http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial2.html#add

Tiamat
2010-03-10, 18:25:59
Mit auf die harte Tour meinte ich:
Es gibt immer jemand, der sowas entwickelt und es gibt immer anderen, die das später nachvollziehen oder erweitern müssen. Der Entwickler hat hier den leichteren Job ( mein Part ) :D

Cool, genau DAS hab ich gesucht.

CtClass point = ClassPool.getDefault().get("Point");
CtField f = new CtField(CtClass.intType, "z", point);
point.addField(f);


Hier wird in in der Klasse Point ne Variable namens z angelegt, genauso gut könnte das n String sein, den jemand über n Textfeld gesetzt hat.
Vielen Dank für den Hinweis!

Shink
2010-03-11, 08:39:49
Es gibt immer jemand, der sowas entwickelt und es gibt immer anderen, die das später nachvollziehen oder erweitern müssen.
Damit ist aber eigentlich schon mit Reflection, AOP und ähnlichem Gedöns sense.

Ganon
2010-03-11, 10:08:40
Allgemein ist es immer ein ziemliches Problem in die Entwicklung anderer Leute einzusteigen. Und mit wachsender Programmgröße wird es nicht leichter.

Nehmen wir mal zum Beispiel das MVC-Prinzip. Da gibt es zig verschiedene Varianten und wenn dann für eine Sache 3-4 verschiedene Klassen in unterschiedlichen Packages existieren, dann wird's irgendwann RICHTIG böse. ^^ Kommen dann noch Vererbung und Bindings (bzw. PropertyChangeEvents) dazu, dann springen einige lieber gleich aus dem Fenster :D