Java不支持這種語法默認。但你可以輕鬆地自己做。
首先解析您想要訪問屬性的String
。
String[] path = "a.b.x".split("\\.");
注意:您需要因爲String#split
作品與Regular Expressions
,並.
在RegEx
作爲一個特殊的通配符處理逃脫.
字符。
之後,您可以使用部分在path
找到這樣的值:
Object o = ... // An Object to start with, "Student" in your
// example (don't make it Student o = ... though!)
for(String part : path){
o = resolveField(o, part) // Overwrites with the new object
}
最終的結果保存在o
。
所有反射的方法發生resolveField
Object resolveField(Object root, String fieldName) throws NoSuchFieldException, IllegalAccessException {
Class<?> clazz = root.getClass();
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true); // Lets you work with private fields. You do not
// have to restore the old value as it's only
// for the Field object, not for the field itself
return field.get(root);
}
注意,有一些庫包含此功能已經,例如Java Expressions Library,雖然它遠不止於此。
可以很容易地發佈一些代碼...... –
感謝** talex **和** Adowrath **。通過使用你的答案,問題解決了。 – romanvintonyak
還有一個org.apache.commons.beanutils.PropertyUtils.getNestedProperty()專用的方法。 – romanvintonyak