Java中的反射确实让人感到尴尬。java.lang.reflect API非常强大和完整,从这个意义上讲也很冗长。与大多数脚本语言不同,没有方便的方法使用反射来动态访问方法和字段。方便的意思是这样的
// PHP
$method = ‘my_method’;
$field = ‘my_field’;
// Dynamically call a method
o
b
j
e
c
t
−
>
object->
object−>method();
// Dynamically access a field
o
b
j
e
c
t
−
>
object->
object−>field;
甚至更好
// JavaScript
var method = ‘my_method’;
var field = ‘my_field’;
// Dynamically call a function
objectmethod;
// Dynamically access a field
object[field];
对于Java员工来说,这是他们只能梦想的事情。他们会写这个
String method = “my_method”;
String field = “my_field”;
// Dynamically call a method
object.getClass().getMethod(method).invoke(object);
// Dynamically access a field
object.getClass().getField(field).get(object);
显然,这并不能解决NullPointerExceptions,InvocationTargetExceptions,IllegalAccessExceptions,IllegalArgumentExceptions,SecurityExceptions,原始类型等问题。在企业环境中,事情必须是安全的,并且Java架构师已经考虑了可能发生的所有可能出现的问题。使用反射时。但是在很多情况下,我们知道我们在做什么,我们并不关心大多数这些功能。我们希望使用不太冗长的方法。
这就是为什么我在jOO *系列中创建了另一个同级产品:jOOR(Java面向对象的反射)。虽然这不是一个杀手lib的库,但对于寻求简单,流利的解决方案的1-2位开发人员而言,它可能很有用。这是我最近在堆栈溢出时遇到的一个示例,其中jOOR可能恰好适合:
// Classic example of reflection usage
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的相同示例:
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的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。