2013-08-04 28 views
10

Czy w języku Java można uzyskać wartość właściwości klasy według jej nazwy? na przykład, mam klasy jakJava uzyska wartość właściwości według nazwy właściwości

public class Test { 
    private String field; 
    public String getField() {...} 
    public void setField() {...} 
} 

i innej klasy z mapą

public class Main { 
    private static final Map<String, Long> map = new HashMap<String, Long>(); 
    static { 
     map.put("field", new Long(1)); 
    } 
    public void doSth() { 
    Set<String> keys = map.keySet(); 
    Test t = new Test(); 
    for (String key : keys) { 
    //t.getPropertyValueByName(key); ? 
    } 
    } 
+1

Tak. Właśnie do tego służy "Reflection API". – qqilihq

Odpowiedz

11

Możesz korzystać z niektórych bibliotek, które oferują dostęp oparty na właściwościach. Myślę, że najbardziej znany i używany jest beanutils. Możesz znaleźć jeden dobry przykład beanutils "w akcji" here. Niektóre przykładowy kod:

A someBean = new A(); 

// access properties as Map 
Map<String, Object> properties = BeanUtils.describe(someBean); 
properties.set("name","Fred"); 
BeanUtils.populate(someBean, properties); 

// access individual properties 
String oldname = BeanUtils.getProperty(someBean,"name"); 
BeanUtils.setProperty(someBean,"name","Barny"); 
+0

Wystąpił problem z 'BeanUtils.getProperty': zwraca ciąg znaków. Nie jest jasne, co zrobić, jeśli masz właściwość innego typu. – Alexey

5

Tak. Możesz zastąpić skomentowaną linię t.getClass(). GetField (map.get (key)). Get (t). który pobierze wartość pola na t.

+1

java.lang.NoSuchFieldException – Ken

0

pytanie, jak często zmieniają właściwości? Czy są stałe, czy będzie to zależało od sytuacji?

Jeśli jest to drugi przypadek, który często jest, chcesz właściwości w pliku zewnętrznym. Standardowy aplet właściwości Java jest świetny do tego: http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html.

Jeśli korzystasz z frameworka, takiego jak wiosna, będzie również oferować standardowe sposoby postępowania z nieruchomościami. Zajrzyj do ich dokumentacji. Odpowiedź

+0

OP nie pyta o właściwość z pliku właściwości, ale o wartość właściwości JavaBean. –

1

bjc2406 za działa dobrze dopóki pole (-a) są dostępne..

t.getClass() getField (map.get (key)) dostać (t)

Jeśli nie możesz w rozsądny sposób udostępnić go publicznie, skorzystaj z funkcji refleksji i innych interfejsów API dostępu w terenie: How do I read a private field in Java?

Powiązane problemy