Java Class对象获取
Class对象是反射操作的起点,获取方式多样,各有适用场景。
三种获取方式
1. 类名.class
Java
Class<?> stringClass = String.class;
Class<?> intClass = int.class; // 基本类型
Class<?> intArrayClass = int[].class; // 数组类型
Class<?> voidClass = void.class; // void类型
适用场景:编译期已知具体类型,代码清晰、性能最优。
2. 对象.getClass()
Java
String str = "hello";
Class<?> clazz = str.getClass();
List<String> list = new ArrayList<>();
Class<?> listClass = list.getClass(); // 返回ArrayList.class
适用场景:运行时已有对象实例,需要获取实际运行时类型。
3. Class.forName()
Java
// 全限定类名
Class<?> clazz = Class.forName("java.lang.String");
// 数组类型需要特殊写法
Class<?> intArrayClass = Class.forName("[I"); // int[]
Class<?> stringArrayClass = Class.forName("[Ljava.lang.String;"); // String[]
适用场景:配置文件读取类名、动态加载类,最灵活但需处理异常。
方式对比
| 方式 | 编译期检查 | 需要实例 | 抛异常 | 典型用途 |
|---|---|---|---|---|
| 类名.class | 是 | 否 | 否 | 常量引用 |
| getClass() | 否 | 是 | 否 | 运行时类型 |
| forName() | 否 | 否 | 是 | 动态加载 |
Class类常用方法
Java
// 类基本信息
String name = clazz.getName(); // java.lang.String
String simpleName = clazz.getSimpleName(); // String
Package pkg = clazz.getPackage(); // package java.lang
// 类型判断
clazz.isArray(); // 是否数组
clazz.isPrimitive(); // 是否基本类型
clazz.isInterface(); // 是否接口
clazz.isAnnotation(); // 是否注解
clazz.isEnum(); // 是否枚举
// 获取组件类型(数组)
Class<?> componentType = clazz.getComponentType();
基本类型与包装类
Java
// 基本类型Class
Class<Integer> intClass = int.class;
// 包装类Class
Class<Integer> integerClass = Integer.class;
// 它们不相等!
System.out.println(intClass == integerClass); // false
// 获取包装类对应的基本类型
Class<?> primitiveType = Integer.TYPE; // int.class
注意事项
Class.forName() 会触发类初始化(执行静态代码块),如需避免可用 forName(className, false, classLoader)
对于数组类型,getName() 返回特殊编码如
[I、[Ljava.lang.Object;
泛型在运行时会被擦除,List.class 和 List.class 是同一个Class对象
要点总结
- 三种获取方式:
.class(编译期)、getClass()(运行时实例)、forName()(动态加载) .class性能最优,forName()最灵活- 注意基本类型与包装类的Class对象不同
- 数组类型的Class有特殊表示方式
📝 发现内容有误?点击此处直接编辑