Java反射机制核心类Class常用方法详解

小豆丁 18小时前 ⋅ 4 阅读
聊天记录
头像

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. 包装类(基本类型的对象表示)

  • BooleanByteShortIntegerLongFloatDoubleCharacter
  • 常用方法: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 安全性 resultnull 时抛出 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 对象进行类型检查。

全部评论: 0

    我有话说: