java.lang.Class 有哪些常用类和方法
java.lang.Class 是 Java 反射机制的核心类,用于描述正在运行的 Java 应用程序中的类和接口。以下是它的常用方法以及 java.lang 包中其他常用类的概览:
一、java.lang.Class 类的常用方法
| 方法 | 说明 |
|---|---|
forName(String className) |
返回指定类名的 Class 对象,会触发类初始化 |
getName() |
返回类的全限定名(如 java.lang.String) |
getSimpleName() |
返回类的简单名称(如 String) |
getCanonicalName() |
返回规范名称(与 getName 类似,但处理内部类不同) |
newInstance() |
创建该类的新实例(已废弃,推荐使用 getDeclaredConstructor().newInstance()) |
getClassLoader() |
返回加载该类的类加载器 |
getSuperclass() |
返回父类的 Class 对象 |
getInterfaces() |
返回实现的接口数组 |
getConstructors() |
返回所有公共构造方法 |
getDeclaredConstructors() |
返回所有构造方法(包括私有) |
getMethods() |
返回所有公共方法(包括继承的) |
getDeclaredMethods() |
返回本类声明的所有方法(不包括继承) |
getFields() |
返回所有公共字段 |
getDeclaredFields() |
返回本类声明的所有字段 |
getAnnotations() |
返回所有注解 |
isInterface() |
判断是否为接口 |
isArray() |
判断是否为数组 |
isPrimitive() |
判断是否为基本类型(int, boolean 等) |
cast(Object obj) |
将对象强制转换为当前 Class 所代表的类型 |
二、java.lang 包中的其他常用类
1. 包装类(基本类型的对象表示)
Boolean、Byte、Short、Integer、Long、Float、Double、Character- 常用方法:
valueOf()、parseXxx()、toString()、xxxValue()
2. 字符串相关
String:不可变字符串,常用方法length()、charAt()、substring()、equals()、split()、replace()、toLowerCase()、trim()等StringBuilder/StringBuffer:可变字符序列,常用方法append()、insert()、delete()、reverse()、toString()
3. 系统与运行时
System:提供标准输入输出、环境变量、系统属性等,常用方法currentTimeMillis()、nanoTime()、exit()、gc()、arraycopy()、getProperty()Runtime:获取运行时环境,常用方法exec()、availableProcessors()、freeMemory()、maxMemory()
4. 数学与数值
Math:静态数学函数,如abs()、max()、min()、pow()、sqrt()、random()、sin()、cos()StrictMath:精度更高的数学计算
5. 线程相关
Thread:线程控制,常用方法start()、run()、sleep()、join()、yield()、interrupt()、currentThread()、setPriority()Runnable:函数式接口,用于定义任务ThreadLocal:线程局部变量
6. 异常与错误
Throwable:所有异常和错误的基类Exception:可检查异常的基类RuntimeException:非检查异常的基类Error:严重错误(如OutOfMemoryError)
7. 其他重要类
Object:所有类的根类,方法有equals()、hashCode()、toString()、clone()、finalize()、getClass()、notify()、wait()Comparable:自然排序接口,实现compareTo()Cloneable:标记接口,允许克隆Number:抽象类,数字包装类的父类Void:占位符类,对应void关键字Enum:枚举类的基类StackTraceElement:堆栈跟踪元素
如果需要针对某个具体类或方法的详细用法示例,可以进一步提问。
Collection.class.isAssignableFrom(result.getClass()) 和instance of可以互换吗?
Collection.class.isAssignableFrom(result.getClass()) 和 result instanceof Collection 在大多数情况下语义等价,但不能无条件互换,主要区别在于:
核心差异
| 对比项 | isAssignableFrom |
instanceof |
|---|---|---|
| 操作对象 | 两个 Class 对象 |
对象 + 类/接口 |
| null 安全性 | ❌ result 为 null 时抛出 NullPointerException |
✅ 直接返回 false |
| 性能 | 较慢(反射调用) | 更快(字节码指令) |
| 灵活性 | 可动态传入任意 Class 进行比较 |
必须在编译期确定目标类型 |
能否互换取决于场景
- 可以互换:当
result一定不为 null 且不需要动态传入目标类型时,两者结果一致。 - 不能直接互换:当
result可能为null时,必须先判空才能使用isAssignableFrom,否则会抛异常。 - 特殊情况:若涉及多个类加载器或动态代理,
instanceof可能更可靠(因为它由 JVM 运行时保证),而isAssignableFrom可能因Class对象来源不同而出现意外结果。
最佳实践
JAVA
// 推荐写法:简洁、安全、高效
if (result instanceof Collection) {
// ...
}
// 如果确实需要动态类型判断(例如 targetClass 是变量),则需判空:
if (result != null && targetClass.isAssignableFrom(result.getClass())) {
// ...
}
总结:优先使用 instanceof,除非你需要动态传入 Class 对象进行类型检查。