Java 推荐一个简化反射操作代码的优雅写法
2018-09-09 本文已影响453人
Little丶Jerry
Java 中反射的写法和相关第三方封装库虽然很多,但笔者还是钟爱于 JOOR,链接 https://github.com/jOOQ/jOOR。
这个库用了好几年了,为什么好用?因为其小巧精致,小巧到只有一个 Java 文件,精致到写出来的代码很优雅。
首先我们回顾下 Java 原生提供的反射写法,比如我们想要调 DataManager 的静态方法 get,如下:
try {
final Method m = DataManager.class.getMethod("get", Context.class);
m.setAccessible(true);
m.invoke(null, this);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
而使用 JOOR 的写法如下:
Reflect.on(DataManager.class).call("get", this);
更高大上的用法自己去看下项目文档吧,反正实现原理也超级简单,就是对 Java 反射的一次包装。JOOR 主要提供了 Reflect
和 ReflectException
,具体如下:
-
Reflect.on:
包裹一个类或者对象,表示在这个类或对象上进行反射,类的值可以是 Class,也可以是完整的类名。 -
Reflect.create:
用来调用 on 类的构造方法,有两种重载,一种有参数,一种无参数。 -
Reflect.call:
方法调用,传入方法名和参数,如有返回值还需要调用 get 方法接收返回值。 -
Reflect.get:
获取(field 和 method 返回)值相关,会进行类型转换,常与 call 和 field 组合使用。 -
Reflect.field:
获取属性值相关,需要调用 get 获取该值。 -
Reflect.set:
设置属性相关。 -
ReflectException:
对 Java 反射各种异常的包装,属于 unchecked 异常,语法上不需要显式进行捕获,但是也需要根据实际情况决定是否进行显式捕获该异常。
本文摘抄自 推荐一个简化反射操作代码的优雅写法