Ich setze öffentliche Felder von Object
this
über Reflektion. Sowohl der Feldname als auch der Wert werden als String
angegeben. Ich verwende mehrere verschiedene Feldtypen: Boolean
, Integer
, Float
, Double
, eine eigene enum
und eine String
.
Es funktioniert mit allen außer mit String
. Die Ausnahme, die ausgelöst wird, ist, dass keine Methode mit der Signatur String.valueOf(String)
existiert ... Jetzt benutze ich eine Dirty instanceof
-Ausweichlösung, um zu erkennen, ob jedes Feld ein String ist. In diesem Fall kopiere einfach den Wert in das Feld.
Irgendwelche Ideen, wie Sie diese Problemumgehung vermeiden können?
Glaubst du java.lang.String
sollte die Methode valueOf(String)
?
Danke.
Wie Sie bemerkt haben, gibt es kein String.valueOf(String)
. Allerdings würde ich Ihre Implementierung nicht als Hack betrachten, nur als Anerkennung der geringen Inkonsistenz in den JDK-Klassen.
Für eine robustere Konvertierung von String in Objekt sollten Sie PropertyEditors , die String-zu-Objekt-Konvertierung direkt unterstützen - Implementierung für primitive Typen und standardmäßig bereitgestellte Zeichenfolgen.) Ihre Syntaxanalysemethode ist dann konsistent und erweiterbar, um verschiedene Typen zu behandeln. Besser noch sind die Conversion-Klassen in Commons Convert und Spring 3 Type Converters , da diese sich ausschließlich auf die Konvertierung und nicht auf die Bearbeitung von Eigenschaften durch die GUI konzentrieren.
Irgendwelche Ideen, wie Sie diese Problemumgehung vermeiden können?
Dies hängt weitgehend von der Implementierung von parseMethod
ab.
Glauben Sie, dass java.lang.String die Methode valueOf (String) unterstützen sollte?
Wofür? Das wäre ein No-Op, einfach seinen Parameter zurückgeben.
Glaubst du
unterstützen?java.lang.String
sollte die MethodevalueOf(String)
?
Nein. Es hätte fast keinen Wert außerhalb der Reflektion, und Reflektion sollte sowieso nicht gefördert werden ( Effektive Java 2nd Edition, Item 53: Schnittstellen zur Reflektion bevorzugen ).
Im Falle eines Strings:
Methode parseMethod = wField.getType (). getMethod ("valueOf", neue Klasse [] {Object.class});
wField.set (this, parseMethod.invoke (wField, value));
Tags und Links string java reflection value-of