2016-05-04 40 views
1

Hashmap Wenn ich Klasse wie dieses:Java, Konvertieren Instanz der Klasse

class MyObject { 
    public int myInt; 
    public String myString; 
} 

Ist es möglich Instanz dieser Klasse zu konvertieren, ohne die Umsetzung Umwandlung Code zu Hashmap?

MyObject obj = new MyObject(); 
obj.myInt = 1; obj.myString = "string"; 
HashMap<String, Object> hs = convert(obj); 

hs.getInt("myInt"); // returns 1 
hs.getString("myString"); // returns "string" 

Does Java bietet diese Art von Lösung, oder ich brauche convert von mir zu implementieren?

Meine Klasse hat mehr als 50 Felder und Schreiben Konverter für jedes Feld ist nicht so gute Idee.

+0

HashMaps haben Schlüssel und Werte (2 Dinge), anstatt 50 Felder. Kannst du klarstellen, was du hier erreichen willst? –

+0

Sie müssen auch eine benutzerdefinierte 'Map'-Implementierung bereitstellen, da die gültige Methode, um den Wert für einen Schlüssel aus der' Map' zu erhalten, die Methode 'get (Object)' ist. Es gibt nichts wie 'getInt' oder 'getString', um verschiedene Typen aus der Map zurückzugeben. Am Ende wäre es nicht sinnvoll, sie zu haben, weil der Rückgabetyp durch den zweiten generischen Typ definiert ist. – SomeJavaGuy

+0

@TimBiegeleisen Ich möchte alle Felder meines Objekts in Schlüssel und Werte von hashmap konvertieren. –

Antwort

1

Sie können Reflexion verwenden, um dieses Verhalten zu implementieren. Sie können alle Felder der Klasse, die Sie konvertieren möchten, zum Iterieren über diese Felder abrufen und den Namen jedes Felds als Schlüssel der Karte verwenden. Dies führt zu einer Zuordnung von String zu Objekt.

Map<String, Object> myObjectAsDict = new HashMap<>();  
Field[] allFields = SomeClass.class.getDeclaredFields(); 
    for (Field field : allFields) { 
     Class<?> targetType = field.getType(); 
     Object objectValue = targetType.newInstance(); 
     Object value = field.get(objectValue); 
     myObjectAsDict.put(field.getName(), value); 
    } 
} 
+0

Wenn einige Felder Listen von Objekten sind? Wie "reflektiert" man sie? –

+0

Wenn die Objektbeziehungen einen Baum und kein Diagramm bilden, können Sie die hier beschriebene Methode verwenden http://stackoverflow.com/questions/6133660/recursive-beanutils-describe – PKuhn

0

Sie könnten eine Karte anstelle einer Klasse verwenden.

Oder haben Ihre Klasse eine Karte erweitern wie

public class MyObject extends HashMap<String, Object> { 

} 
1

So etwas wird es tun:

MyObject obj = new MyObject(); 
obj.myInt = 1; obj.myString = "string"; 
Map<String, Object> map = new HashMap<>(); 
// Use MyObject.class.getFields() instead of getDeclaredFields() 
// If you are interested in public fields only 
for (Field field : MyObject.class.getDeclaredFields()) { 
    // Skip this if you intend to access to public fields only 
    if (!field.isAccessible()) { 
     field.setAccessible(true); 
    } 
    map.put(field.getName(), field.get(obj)); 
} 
System.out.println(map); 

Ausgang:

{myString=string, myInt=1} 
Verwandte Themen