类处理工具类 - ClassUtil
# 类处理工具类 - ClassUtil
简介
ClassUtil
是 Hutool 提供的一个类处理工具类,主要用于封装一些与反射相关的方法,使其调用更加便捷。ClassUtil
中最有用的方法之一是 scanPackage
,它可以扫描指定包及其子包下的所有类。在框架开发、依赖注入等场景中非常有用。
# 1. 获取类名的短格式
ClassUtil
提供了 getShortClassName
方法,用于获取完整类名的短格式。例如,将 cn.hutool.core.util.StrUtil
转换为 c.h.c.u.StrUtil
。
import cn.hutool.core.util.ClassUtil;
public class ClassUtilExample {
public static void main(String[] args) {
// 获取类名的短格式
String shortClassName = ClassUtil.getShortClassName("cn.hutool.core.util.StrUtil");
System.out.println("短类名: " + shortClassName);
}
}
2
3
4
5
6
7
8
9
getShortClassName(String className)
:获取类名的短格式。className
:完整的类名字符串。- 返回值:类名的短格式。
作用: 将长类名转换为短格式,有助于缩短日志或控制台输出的信息长度。
实际开发场景: 在日志记录、调试输出中,可以使用此方法简化类名显示,提升可读性。
# 2. 比较两组类是否兼容
ClassUtil
提供了 isAllAssignableFrom
方法,用于比较两组类是否兼容,即 types1
中的所有类是否都与 types2
中对应位置的类相同、或者是其父类或接口。
import cn.hutool.core.util.ClassUtil;
public class ClassUtilExample {
public static void main(String[] args) {
// 定义两组类
Class<?>[] types1 = {Number.class, Object.class};
Class<?>[] types2 = {Integer.class, String.class};
// 判断两组类是否兼容
boolean result = ClassUtil.isAllAssignableFrom(types1, types2);
System.out.println("类型兼容性: " + result);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
isAllAssignableFrom(Class<?>[] types1, Class<?>[] types2)
:比较两组类是否兼容。types1
:第一组类,父类或接口组。types2
:第二组类,子类组。- 返回值:如果
types1
中的所有类都与types2
对应位置的类兼容,返回true
,否则返回false
。
作用: 检查两组类之间的兼容性,主要用于泛型类型推断或多态性判断。
实际开发场景: 在动态代理、泛型操作等场景中,可以使用此方法判断类之间的兼容性。
# 3. 判断是否为包装类型
ClassUtil
提供了 isPrimitiveWrapper
方法,用于判断给定的类是否为原始类型的包装类。
import cn.hutool.core.util.ClassUtil;
public class ClassUtilExample {
public static void main(String[] args) {
// 判断Integer是否为包装类型
boolean isWrapper = ClassUtil.isPrimitiveWrapper(Integer.class);
System.out.println("Integer是包装类型: " + isWrapper);
}
}
2
3
4
5
6
7
8
9
isPrimitiveWrapper(Class<?> clazz)
:判断给定的类是否为包装类型。clazz
:目标类。- 返回值:如果是包装类型,返回
true
,否则返回false
。
作用: 判断类是否为原始类型的包装类,如
Integer
、Boolean
等。实际开发场景: 在反射操作中,可以使用此方法判断对象是否为包装类型,从而决定进一步的操作。
# 4. 判断是否为基本类型
ClassUtil
提供了 isBasicType
方法,用于判断给定的类是否为基本类型(包括包装类和原始类)。
import cn.hutool.core.util.ClassUtil;
public class ClassUtilExample {
public static void main(String[] args) {
// 判断int是否为基本类型
boolean isBasic = ClassUtil.isBasicType(int.class);
System.out.println("int是基本类型: " + isBasic);
// 判断Integer是否为基本类型
isBasic = ClassUtil.isBasicType(Integer.class);
System.out.println("Integer是基本类型: " + isBasic);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
isBasicType(Class<?> clazz)
:判断给定的类是否为基本类型。clazz
:目标类。- 返回值:如果是基本类型,返回
true
,否则返回false
。
作用: 判断类是否为基本类型或其包装类,如
int
、Integer
等。实际开发场景: 在类型检查或反射操作中,判断对象是否为基本类型,从而决定后续的处理逻辑。
# 5. 获取类所在包的名称
ClassUtil
提供了 getPackage
方法,用于获取给定类所在包的名称。
import cn.hutool.core.util.ClassUtil;
public class ClassUtilExample {
public static void main(String[] args) {
// 获取StrUtil类所在包的名称
String packageName = ClassUtil.getPackage(ClassUtil.class);
System.out.println("ClassUtil类所在包: " + packageName);
}
}
2
3
4
5
6
7
8
9
getPackage(Class<?> clazz)
:获取类所在包的名称。clazz
:目标类。- 返回值:类所在包的名称。
作用: 获取类的包信息,便于进行包级别的处理或操作。
实际开发场景: 在类扫描、包级别操作等场景中,可以使用此方法获取类的包信息。
# 6. 扫描指定包下的所有类
ClassUtil
提供了 scanPackage
方法,用于扫描指定包及其子包下的所有类,返回结果为此包及其子包下所有的类。
import cn.hutool.core.util.ClassUtil;
import java.util.Set;
public class ClassUtilExample {
public static void main(String[] args) {
// 扫描cn.hutool包下的所有类
Set<Class<?>> classes = ClassUtil.scanPackage("cn.hutool");
// 输出扫描到的类
classes.forEach(clazz -> System.out.println("类: " + clazz.getName()));
}
}
2
3
4
5
6
7
8
9
10
11
12
13
scanPackage(String packageName)
:扫描指定包及其子包下的所有类。packageName
:包名。- 返回值:一个
Set
,包含包及其子包下的所有类。
作用: 扫描指定包下的所有类,便于在框架开发、依赖注入等场景中使用。
实际开发场景: 在需要动态扫描类以进行依赖注入或类注册时,可以使用此方法获取指定包下的所有类。
# 7. 获取当前线程的 ClassPath
ClassUtil
提供了 getClassPaths
方法,用于获取当前线程的 ClassPath。
import cn.hutool.core.util.ClassUtil;
import java.util.List;
public class ClassUtilExample {
public static void main(String[] args) {
// 获取当前线程的ClassPath
List<String> classPaths = ClassUtil.getClassPaths();
// 输出ClassPath
classPaths.forEach(path -> System.out.println("ClassPath: " + path));
}
}
2
3
4
5
6
7
8
9
10
11
12
13
getClassPaths()
:获取当前线程的 ClassPath。- 返回值:一个
List
,包含当前线程的所有 ClassPath。
作用: 获取当前线程的 ClassPath,用于类加载或资源查找。
实际开发场景: 在需要加载资源或类文件时,可以使用此方法获取当前线程的 ClassPath。
- 返回值:一个
# 8. 获取指定类型的默认值
ClassUtil
提供了 getDefaultValue
方法,用于获取指定类型的默认值。
import cn.hutool.core.util.ClassUtil;
public class ClassUtilExample {
public static void main(String[] args) {
// 获取int类型的默认值
Object intDefault = ClassUtil.getDefaultValue(int.class);
System.out.println("int类型的默认值: " + intDefault);
// 获取String类型的默认值
Object stringDefault = ClassUtil.getDefaultValue(String.class);
System.out.println("String类型的默认值: " + stringDefault);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
getDefaultValue(Class<?> clazz)
:获取指定类型的默认值。clazz
:目标类型。- 返回值:指定类型的默认值。对于原始类型返回其对应的默认值(如
0
或false
),对于引用类型返回null
。
作用: 根据类型获取默认值,避免在处理未初始化变量时出现空指针异常。
实际开发场景: 在处理未初始化变量或构造默认对象时,可以使用此方法为不同类型赋予合理的默认值。
# 9. 获取当前线程的类加载器
ClassUtil
提供了 getClassLoader
和 getContextClassLoader
方法,用于获取当前线程的类加载器。
import cn.hutool.core.util.ClassUtil;
public class ClassUtilExample {
public static void main(String[] args) {
// 获取当前线程的类加载器
ClassLoader contextClassLoader = ClassUtil.getContextClassLoader();
System.out.println("当前线程的类加载器: " + contextClassLoader);
// 获取默认类加载器
ClassLoader defaultClassLoader = ClassUtil.getClassLoader();
System.out.println("默认类加载器: " + defaultClassLoader);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
getContextClassLoader()
:获取当前线程的类加载器。getClassLoader()
:获取默认类加载器,当getContextClassLoader
失败时,返回ClassUtil
的类加载器。作用: 获取当前线程或默认的类加载器,便于加载类或资源。
实际开发场景: 在需要动态加载类或资源时,可以使用此方法获取类加载器,从而进行类加载或资源查找。
总结
ClassUtil
工具类在处理反射操作、类加载、包扫描等方面提供了便捷且强大的工具方法。它适用于各种需要与类或类加载器交互的场景,帮助开发者更高效地进行类的操作和管理,提高开发效率。