Помимо использования Apache BeanUtils или использования java.lang.reflect
API напрямую, как предлагали другие, вы также можете использовать jOOR , который я создал, чтобы уменьшить многословность использования отражения в Java.Ваш пример может быть реализован следующим образом:
Employee[] employees = on(department).call("getEmployees").get();
for (Employee employee : employees) {
Street street = on(employee).call("getAddress").call("getStreet").get();
System.out.println(street);
}
Тот же пример с нормальным отражением в Java:
try {
Method m1 = department.getClass().getMethod("getEmployees");
Employee employees = (Employee[]) m1.invoke(department);
for (Employee employee : employees) {
Method m2 = employee.getClass().getMethod("getAddress");
Address address = (Address) m2.invoke(employee);
Method m3 = address.getClass().getMethod("getStreet");
Street street = (Street) m3.invoke(address);
System.out.println(street);
}
}
// There are many checked exceptions that you are likely to ignore anyway
catch (Exception ignore) {
// ... or maybe just wrap in your preferred runtime exception:
throw new RuntimeException(e);
}
Кроме того, jOOR оборачивает функциональность java.lang.reflect.Proxy
более удобным способом:
interface StringProxy {
String mySubString(int beginIndex);
}
// You can easily create a proxy of a custom type to a jOOR-wrapped object
String substring = on("java.lang.String")
.create("Hello World")
.as(StringProxy.class)
.mySubString(6);