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