Common 常用模块

Date 日期处理

Reflection 反射

Input/Output 输入/输出

HTTP 请求

加密/解密

其他

Clazz

Clazz 提供类加载和类型层次检查功能。对象实例化已经独立到 NewInstance

加载类

getClassByName(String) 根据完整类名加载类;找不到类时抛出 RuntimeException,并将原始 ClassNotFoundException 保留为 cause。泛型重载还会验证类型是否兼容:

Class<CharSequence> type =
        Clazz.getClassByName("java.lang.String", CharSequence.class);

// String 不是 Number,抛出 ClassCastException。
Clazz.getClassByName("java.lang.String", Number.class);

目标类型为 null 时抛出 IllegalArgumentException

将参数转换为类

args2class(Object[]) 返回每个参数的运行时类型。参数数组为 null 或空数组时返回 null。 数组内的单个 null 元素会触发 IllegalArgumentException,异常会指出元素索引;参数值为 null 时应显式传入 Class<?>[]

Class<?>[] types = Clazz.args2class(new Object[]{"text", 1});
// [String.class, Integer.class]

检查接口和父类

getDeclaredInterface(Class<?>) 返回类及其父类实现的所有接口,并递归遍历父接口。内部使用 Set<Class<?>>,因此菱形接口继承不会产生重复结果。

getAllSuperClass(Class<?>) 返回父类链,不包含输入类和 Object。传入接口类型是安全的,此时返回空数组。

Class<?>[] interfaces = Clazz.getDeclaredInterface(ArrayList.class);
Class<?>[] parents = Clazz.getAllSuperClass(ArrayList.class);

getClassByInterface(Type) 直接委托给 Types.type2class(Type),不再解析 Type.toString() 的展示 字符串。因此它对类、参数化类型、类型变量、通配符和泛型数组遵循相同规则;不能唯一解析的类型会 抛出 IllegalArgumentException

两个层次方法都对 null 类参数抛出 IllegalArgumentException