[利其器]优雅如斯的反射工具: JOOR

JOOR是一个简化Java反射API的工具库,提供链式调用、异常封装等特性,使得反射操作更加简洁易懂。然而,它并未内置缓存机制,需要开发者自行实现。文章通过示例展示了JOOR的优势,并引发对框架极致优化和编码边界思考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
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住特殊情况。而又不至于影响基本情况。制造代码隔离。

下一篇:《写一个工具类的方法》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值