Java Bean
'u Map
'a dönüştürmede takılıyorum. İnternette birçok kaynak var, ama maalesef hepsi basit fasulyeleri Haritalar'a dönüştürüyor. Benimkiler biraz daha geniş.Java Bean'i bir Haritaya Düzleştirme
basitleştirilmiş bir örnek vardır:
public class MyBean {
private String firstName;
private String lastName;
private MyHomeAddress homeAddress;
private int age;
// getters & setters
}
Benim demek bu durumda, aşağıdaki koşullar için de geçerlidir, Map<String, Object>
üretmektir:
map.containsKey("firstName")
map.containsKey("lastName")
map.containsKey("homeAddress.street") // street is String
map.containsKey("homeAddress.number") // number is int
map.containsKey("homeAddress.city") // city is String
map.containsKey("homeAddress.zipcode") // zipcode is String
map.containsKey("age")
denedim Apache Commons BeanUtils
kullanarak. Her iki yaklaşım da BeanUtils#describe(Object)
ve BeanMap(Object)
, "derin düzey" 1 olan bir Harita üretir (yaninesnesini bir değer olarak tutan "homeAddress"
anahtar vardır). Benim yöntemim, bir ilkel tür (veya Dize) karşılayana kadar nesneleri daha derin ve daha derin girmeli, o zaman kazmayı durdurmalı ve anahtar eklemek gerekir "order.customer.contactInfo.home"
.
Yani, sorum şu: Nasıl yapılmalı (ya da zaten bunu yapmamı sağlayacak mevcut bir proje var)? Burada basit yansıtıcı/özyinelemeli örnektir
private static boolean isValue(Object value) {
final Class<?> clazz = value.getClass();
if (value == null ||
valueClasses.contains(clazz) ||
Collection.class.isAssignableFrom(clazz) ||
Map.class.isAssignableFrom(clazz) ||
value.getClass().isArray() ||
value.getClass().isEnum()) {
return true;
}
return false;
}
Büyük ihtimalle "ilkel" anlamına gelmez, çünkü "String" ilkel değildir ('Object' genişletir). Bu nedenle, hangi sınıfların geçiş yapacağı ve değerleri nasıl alacağı algoritmasını anlamanız için bir yönteme ihtiyacınız vardır, bu yüzden muhtemelen bir yapılandırma yapmadan (belki ek açıklamalarla) bunu yapmanın bir yolu olmayacaktır. – Tonio
Bu yansıma ve yineleme ile yapılabilir, sadece kesinlikle kendiniz yazmanız gerekir. Şu anda kütüphane önerileri için soru sorulmadığı için sorunun kapanacağını unutmayın. – Radiodef
Tonio, Radiodef - önerileriniz için teşekkürler, mesajımı düzenledim. –