PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java: Variablennamen herausfinden, geht es oder nicht?


mobius
2008-10-13, 14:32:29
Hi Leute,

Ich hab hier Methoden die so aussehen:


String _Variable1;
String _Variable2;
...

public String get_Variable1() {
return "<Variable1>" + _Variable1 + "</Variable1>";
}

public String get_Variable2() {
return "<Variable2>" + _Variable2 + "</Variable2>";
}
...

Das ganze wollte ich jetzt in eine Methode zusammenfassen:

public String getStatement(String S) {
return ("<" + S.substring(1) +">" + S + "</" + S.substring(1) + ">");

Allerdings ist mir aufgefallen das ich in der Mitte den Inhalt der Variablen reinschreibe, für die eckigen Klammern allerdings den Namen der Variablen bräuchte, die mir übergeben wurde. Daher ist der unterstrichene Teil Unsinn.
Gibt es eine Chance das zu realisieren? Googlen brachte widersprüchliche Ergebnisse. Von geht nicht bis hin zu Einzellösungen.

instinct
2008-10-13, 14:53:12
Über reflections solltest du an den Namen der Variablen kommen.

EDIT: http://java.sun.com/javase/6/docs/api/java/lang/reflect/package-summary.html

mobius
2008-10-13, 15:26:30
Bis zum Klassennamen komme ich, aber ich finde nichts passendes für den Variablennamen. Bin ich blind?

instinct
2008-10-13, 15:42:01
Was du brauchst ist ein Objekt vom Typ 'Field' und soweit ich weiss gibt es dort eine Methode 'getName()'.

mobius
2008-10-14, 10:31:39
Bringt mir leider auch nichts. Hab jetzt tausende Beispiele durchgeguckt und nichts führt mich dahin wohin ich möchte. Ich finde immer nur Wege die Klasse oder die Variablenwerte herauszukriegen, aber nicht den Variablennamen.
Ich verzweifle doch langsam, dabei kann das doch unmöglich so schwer sein...

Pinoccio@ausgeloggt
2008-10-14, 11:27:22
Bringt mir leider auch nichts. Hab jetzt tausende Beispiele durchgeguckt und nichts führt mich dahin wohin ich möchte. Ich finde immer nur Wege die Klasse oder die Variablenwerte herauszukriegen, aber nicht den Variablennamen.
Ich verzweifle doch langsam, dabei kann das doch unmöglich so schwer sein...Könnte es sein, daß der Compiler allen Variablen selber neue Namen verteilt und garnicht mehr weiß, daß sie im Quelltext ursprünglich Variable_Mit_Extrem_Langen_Namen hieß?

mfg

mobius
2008-10-14, 11:41:56
Soweit ich google trauen kann, gibt es nach der Compilierung gar keine Parameternamen mehr, weil die VM sie nicht braucht. Von daher geht mein Ansatz nicht. Die Reflections können mir auch nicht helfen.
Meiner Meinung nach käse. Muss ich jetzt die unzähligen Methoden stehen lassen, nur weil ich den Parameternamen nicht rausbekomme, um alles in einer Methode zusammen zu fassen?

Trap
2008-10-14, 11:46:19
Bei deinem Beispiel gibt es nur einen Parameternamen: "S". Den willst du doch garnicht herausfinden, oder?

Objekte haben keine Namen, nur Variablen können Namen haben. Wenn du in getStatement einen Namen für das Objekt brauchst, musst der Aufrufer den auch übergeben.

Shink
2008-10-14, 11:52:06
Könnte es sein, daß der Compiler allen Variablen selber neue Namen verteilt und garnicht mehr weiß, daß sie im Quelltext ursprünglich Variable_Mit_Extrem_Langen_Namen hieß?

mfg
Wie würde denn dann der Debugger funktionieren?

Probier mal: (ist nicht getestet)

public String getStatement(String S) {
Field[] fields=getClass().getFields();
for (int i=0;i<fields.length;i++) {
String name=fields[i].getName();
if (name.equals(S)) {
return ((String)(fields[i].get(this)));
}
}
return null;
}

und überleg dir ob das eigentlich klug ist was du da machst.

Matrix316
2008-10-14, 12:17:54
Gibts bei Java sowas wie: Variablenname.ToString() ? Blödsinn :rolleyes:

mobius
2008-10-14, 12:26:37
Ok hab den gedanklichen Twist gefunden. Trap hat mich drauf gebracht.
Meinen Ansatz fand ich dennoch eleganter, auch wenns nichtmal geht. Schöne Welt.
Danke euch allen.

PatkIllA
2008-10-14, 14:16:18
Tu dir auf jeden Fall den Gefallen und bau das XML nicht mit Stringverknüpungen zusammen.
Und wenn du dir für jede Variable ein Feld machst geht mit Reflection auch dein Ansatz. Meistens braucht man das ja eh.

Berni
2008-10-14, 15:34:44
Da muss ich dem PatkIllA recht geben. Wenn du das einfach so als String selber zusammenbastelst, wird kein Escaping durchgeführt und dann ist das resultierende XML möglicherweise nicht mehr korrekt.

mobius
2008-10-15, 11:13:11
Wie baut man es denn wirklich anständig zusammen? Hab bisher nur Erfahrung mit fertigen XML Dateien und parsing.
Momentan arbeite ich an einem bestehenden Projekt, mal gucken wieviel ich daran wirklich ändern kann.

Shink
2008-10-15, 11:20:33
Da muss ich dem PatkIllA recht geben. Wenn du das einfach so als String selber zusammenbastelst, wird kein Escaping durchgeführt und dann ist das resultierende XML möglicherweise nicht mehr korrekt.
Das stimmt natürlich! Außerdem passt dann z.B. möglicherweise das Encoding nicht und spätestens wenns um Namespaces etc. geht ist das nicht ganz so einfach.
Wie baut man es denn wirklich anständig zusammen? Hab bisher nur Erfahrung mit fertigen XML Dateien und parsing.
Momentan arbeite ich an einem bestehenden Projekt, mal gucken wieviel ich daran wirklich ändern kann.
Mit JDOM funktioniert das z.B. sehr einfach:
http://www.tutorials.de/forum/java-tutorials/66060-jdom-lesen-schreiben-von-xml.html

mobius
2008-10-15, 11:59:02
Ok danke Leute, ich versuchs mal so umzusetzen. Man lernt nie aus.

Hab folgendes Problem: "appendChild" und XMLOutputter" sind undefined.

Importiert hab ich

import org.jdom.*;
import org.jdom.output.XMLOutputter;

import org.input.SAXBuilder; -> will nicht funktionieren. Hab auch noch SAX runtergeladen und eingebunden, aber kein Erfolg.

Was fehlt?

Abnaxos
2008-10-15, 13:45:50
Hab folgendes Problem: "appendChild" und XMLOutputter" sind undefined.
Genaue Fehlermeldung? In welcher Umgebung arbeitest du? Was hast du genau versucht?

import org.input.SAXBuilder; -> will nicht funktionieren.
Genaue Fehlermeldung? In welcher Umgebung arbeitest du? Was hast du genau versucht? (

Hab auch noch SAX runtergeladen und eingebunden, aber kein Erfolg.
SAX musst du nicht separat herunterladen, das ist seit 1.3 Bestandteil der Java-API. Was verstehst du unter "eingebunden"?

Was fehlt?
Zu wenige Informationen, sorry, so kann ich nicht helfen.

mobius
2008-10-15, 14:14:33
Arbeite mit Eclipse 3.3.0.
Okay das SAX drin ist wusste ich nicht, daher hab ich es von der Seite runtergeladen und per Properties in den Java Build Path eingebunden.

"The method appendChild(Element) is undefined for the Type Element"
"The constructor for XMLOutputter(String, boolean) is undefined"

import org.jdom.*;
import org.jdom.output.XMLOutputter;

public void createXML2(){
Element root = new
Element("StartElement");
Document doc = new Document(root);
root.appendChild(new Element("kindElement"));
XMLOutputter outputter = new XMLOutputter(" ",true);
FileStream output = new FileOutPutStream("file.xml");
outputter.output(doc,output);
}

Beispiel hatte ich dem hier entnommen:
http://www.tutorials.de/forum/java/66039-xml-schreiben-und-parsen-java.html

Für mich siehts danach aus, dass was nicht importiert wurde.

Abnaxos
2008-10-15, 14:40:36
"The method appendChild(Element) is undefined for the Type Element"
Richtig. Die Methode heisst addContent().

"The constructor for XMLOutputter(String, boolean) is undefined"
Das ist ebenfalls richtig, so einen Konstruktor gibt es nicht. XMLOutputter(), XMLOutputter(Format) oder XMLOutputter(XMLOutputter) sind gültige Konstruktoren (aus der API von JDOM 1.1).

Der Code sieht ansonsten OK aus.

Beispiel hatte ich dem hier entnommen:
http://www.tutorials.de/forum/java/66039-xml-schreiben-und-parsen-java.html
Ah, das Datum dieses Postings erklärt einiges: Im Januar 2003 war JDOM noch im Beta-Stadium. Da hat sich noch einiges getan, unter anderem wurde mindestens einmal die gesamte API komplett umgebaut. Die aktuelle JavaDoc findest du hier: http://www.jdom.org/docs/apidocs/index.html

Für mich siehts danach aus, dass was nicht importiert wurde.
Nein, sonst hätte die Fehlermeldung gesagt, dass die Klassen nicht vorhanden seien. Die Klassen scheint der Compiler aber gefunden zu haben, sonst hätte er dir gar nicht erst sagen können, dass du Konstruktoren/Methoden aufzurufen versuchst, die gar nicht existieren. Daher habe ich so kleinlich nach den Fehlermeldungen gefragt: Wenn man noch unsicher ist, interpretiert man häufig die Fehlermeldungen falsch (nicht böse gemeint, das ist einfach eine Beobachtung, die ich im Usenet und in Foren gemacht habe). Daher sollte man eben immer die exakten Meldungen zitieren.

mobius
2008-10-15, 15:14:25
Das erklärt einiges. Danke erstmal.

Ne Idee warums crasht?

public void main(String[] args) {
Element root = new
Element("DOCUMENT");
Document doc = new Document(root);
root.addContent(new Element("kindElement"));
XMLOutputter outputter = new XMLOutputter();
FileOutputStream output = null;
try {
output = new FileOutputStream("file.xml");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
outputter.output(doc,output);
} catch (IOException e) {
e.printStackTrace();
}
}

Console:
java.lang.NoSuchMethodError: main
Exception in thread "main"

Alternativ:
java.lang.NoSuchMethodError: main
Exception in thread "main" ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [../../../src/share/back/util.c:820]

Wtf?

Pinoccio
2008-10-15, 15:20:04
Ne Idee warums crasht?
public void main(String[] args) {...}
Console:
java.lang.NoSuchMethodError: main
Exception in thread "main"Da fehlt das static. (http://telecom.ntua.gr/HTML.Tutorials/java/anatomy/main.html)
Das genau meint auch die Exception: Kann die Klasse nicht ausführen, weil es die dafür notwendige Funktion public static void main(String[]) nicht gibt.
(Die Reihenfolge von public und static ist übrigens dem Compiler egal, die Konvention ist aber public static.)

mfg