JDK的反射api代码又长又难用。
JOOR的目标 便是 简化 JDK反射API。
JOOR是java.lang.reflect包的一个简单包装器。
先看一个范例
这是我用反射实现的一个全局配置部分代码
Class parentClass = object.getClass();
WinConfig annotation = (WinConfig) parentClass.getAnnotation(WinConfig.class);
if (annotation == null) {
return;
}
boolean isUseEvent = annotation.useEventBus();
while(true) {
Class superClass = parentClass.getSuperclass();
if (superClass == null || superClass.equals("")) {
break;
}
parentClass = superClass;
try {
Field eventBusOn = parentClass.getDeclaredField("isEventBusOn");
if (eventBusOn != null) {
eventBusOn.setAccessible(true);
eventBusOn.setBoolean(object, isUseEvent);
break;
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
用jooq之后是这样的
Class theClass = object.getClass();
WinConfig annotation = (WinConfig) theClass.getAnnotation(WinConfig.class);
if (annotation == null) {
return;
}
boolean isUseEvent = annotation.useEventBus();
try {
Reflect.on(object).set("isEventBusOn", isUseEvent);
} catch (ReflectException e) {
e.printStackTrace();
}
有没有大呼过瘾的感觉。逻辑一下子清晰了。看反射太费劲。
看着案例,总结优势
- 链式调用。代码更简洁,更易理解。
- Exception包装成1个。简化了反射冗长的异常处理。
- 不需要考虑private。内部动态区分是否需要accessible()。
- 一句create()。简化了对Class、Method等反射类的实例化,改为统一Reflect替换。
看着案例,总结缺点
- JOOR是对反射Api的封装,但是没有进行缓存。
- 换言之,缓存还是需要自己实现的。
如何引用
gradle配置
//joor
// https://mvnrepository.com/artifact/org.jooq/joor-java-8
api group: 'org.jooq', name: 'joor-java-8', version: '0.9.9'
若想查询最新版本,可以点击这个链接
JOOR简介
JOOR有三个文件。一个Exception包装类,Reflect类,CompileOptions配置类。
ReflectException
这是一个包装类,包装了任何Java检查反射异常。
包装的异常:
- ClassNotFoundException
- IllegalAccessException
- IllegalArgumentException
- InstantiationException
- InvocationTargetException
- NoSuchMethodException
- NoSuchFieldException
- SecurityException
Reflect类
一种对象或类的包装器,可以对其进行反射调用。
这是官方的范例。这代码有点简洁的。
// Static import all reflection methods to decrease verbosity
import static org.joor.Reflect.*;
// Wrap an Object / Class / class name with the on() method:
on("java.lang.String")
// Invoke constructors using the create() method:
.create("Hello World")
// Invoke methods using the call() method:
.call("toString")
// Retrieve the wrapped object
进一步思量
- JOOR的为何没有实现缓存呢?
- 没有缓存?就影响效率。怎么看待JOOR没有实现缓存呢?
- 是否所有的框架都应该做到极致呢?
- 编码的边界怎么界定?
- 写到什么程度应该可以告阶段性停止了呢?
最常遇到的编码工作,都会碰到这个问题。
我的拙见:每一个工具,每一个文件,都需要有一个明确的定位。
拿工具类为例:
你的工具类是否涵盖了所有的情况?那么涵盖了所有情况,工具类就变得庞大。如何进行优雅的取舍呢?
一个核心思想:你编写的逻辑整理。你的考量。
一份严谨的逻辑覆盖:能覆盖住大部分的情况。
一块个例的附加空间:总要能cover住特殊情况。而又不至于影响基本情况。制造代码隔离。
下一篇:《写一个工具类的方法》