2011-11-29 30 views
8

Bir Varlıkta bulunan bir Hashmap alanı/değerleri oluşturmam gerekiyor, böylece bunları alan adlarıyla etiket içeren bir Dize'de değiştirmek için kullanabilirim.java yansıması oluşturmak için alan/değer hashmap

Bu kodu vardır:

public static String replaceTags(String message, Map<String, String> tags) ... 

etiketleri eşdeğer değerler için mesajında ​​ bulunan tüm etiketler yerine, ancak Harita tablo oluşturmak için Ben "Herhangi almak gerekir "Varlık ve Varlıktan bir Harita oluşturabilme. Peki bunu nasıl mümkün yapabilirim? Varlığı gönderdiğim ve tüm alanlar ve değerler ile bir Harita döndürdüğüm bir rutini almak.

public static Map<String, String> getMapFromEntity(Object entity){ 
    Map<String, String> map = new HashMap<String, String>(); 

    ...????? 

    return map; 
} 

Ben yansıma kullanabilirsiniz biliyorum ve bu Bunu halletmek için bulduk tek yaklaşım olmakla birlikte, aynı gerçekleştirmek için başka bir yol yoktur ?, ben daha etkili bir yolunu demek.

Teşekkürler.

+0

Girdi dizesinde hangi etiketlerin bulunabileceğini bilmiyorsanız, yansıma AFAIK'ın tek yolu olacaktır. – aishwarya

+0

Evet @aishwarya, varlık herhangi bir veri içerebilir, bu yüzden yansıma tek yoldur, teşekkürler. –

+0

http://stackoverflow.com/questions/6796187/java-introspection-object-to-map – Vadzim

cevap

9
Field[] fields = entity.getClass().getFields(); 
    Map<String, String> map = new HashMap<String, String>(); 
    for(Field f : fields) 
      map.put(f.getName(),(String) f.get(entity)); 

O, ve varlığınız sınıfınızın değil, sınıfınızın bir nesnesi olmalıdır. Ben yansıma kullanabilirsiniz biliyorum

Method[] methods = entity.getClass().getMethods(); 
    Map<String, String> map = new HashMap<String, String>(); 
    for(Method m : methods) 
    { 
     if(m.getName().startsWith("get")) 
     { 
      String value = (String) m.invoke(entity); 
      map.put(m.getName().substring(3), value); 
     } 
    } 
+0

Merhaba Ademiban, kod için teşekkürler, çok iyi çalışıyor!, Hatta geri döndürülen bazı değerleri de almam gerektiğini düşündüm Yöntemler tarafından hepsi değil, çünkü dizeleridir, ancak ana kodunuz olduğunda bu basittir. Boole'lar için –

+4

alıcıları "is" ;-) ile başlayabilir. değerleri doğrudan doğruya ayarlandıktan sonra doğrudan alanlardan almak daha kolaydır, ancak yöntemleri de yapabilirsiniz. – aishwarya

0

ve: senin alanları özeldir ve onlar için alıcılar varsa yöntemi adı "get" prefix.Like bununla başlarsa , sen GetMethods (kullanın) ve kontrol etmelidir Bunu yapmak için bulduğum tek yaklaşım bu, ama aynı gerçekleştirmek için başka bir yolu var mı?

olarak bildiğim kadarıyla, yansıma sınıf (lar) bazı arabirimini uygulamak haritayı oluşturmak istemiyorsanız, bunu gerçekleştirmek için tek yoldur ve harita çıkarma kodunuzu Bu arayüz farkındadır.