Java获取类对象
Java获取类对象
1. Class.forName(全限定类名)
Class.forName(String className):通过类的全限定名动态加载类,返回对应的Class对象。此方法会触发类的初始化(除非显式关闭)。
Class<?> clazz = Class.forName("java.lang.String");
- 需处理ClassNotFoundException。
- 适用于运行时根据字符串类名加载类(如配置驱动的场景)。
2. 对象实例.getClass()
对象实例的getClass()方法:通过对象实例的getClass()方法获取其运行时类的Class对象。
String str = "Hello";
Class<?> clazz = str.getClass(); // 返回String类的Class对象
- 只能用于已存在的对象实例。
- 返回的是对象的实际类型(考虑多态)。
3. 类名.class
类字面常量(ClassName.class):直接通过类名后加.class获取Class对象,无需实例化对象或调用方法。
Class<String> stringClass = String.class;
Class<int[]> arrayClass = int[].class; // 数组类型
Class<Integer> intWrapperClass = Integer.TYPE; // 等同于int.class(基本类型)
- 支持类、接口、数组、基本类型(如int.class)。
- 不会触发类的初始化(静态块不会执行)。
4. 类加载器的loadClass方法
通过ClassLoader加载类:使用类加载器的loadClass()方法加载类,返回Class对象。默认不触发初始化。
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
Class<?> clazz = classLoader.loadClass("java.lang.String");
- 需要处理ClassNotFoundException。
- 适合需要控制类加载过程的场景(如自定义类加载器)。
其他补充
基本类型的Class对象
通过基本类型.class或包装类的TYPE字段获取:
Class<Integer> intClass = int.class; // 直接使用基本类型
Class<Integer> intClassViaWrapper = Integer.TYPE; // 等同于int.class
反射中的父子类关系
通过已有Class对象获取父类或接口:
Class<?> superClass = String.class.getSuperclass(); // 获取父类Object的Class
Class<?>[] interfaces = List.class.getInterfaces(); // 获取接口的Class数组
总结
| 方法 | 场景 | 是否触发初始化 |
|---|---|---|
| Class.forName() | 动态加载类(需类名字符串) | 默认是 |
| 对象.getClass() | 通过实例获取运行时类型 | 实例已存在 |
| 类名.class | 直接获取类的元信息(编译时确定) | 否 |
| ClassLoader.loadClass() | 自定义类加载控制 | 默认否 |
| 根据具体需求选择合适的方式,如反射、动态代理或框架开发中常用Class.forName()和类字面常量,而getClass()多用于对象类型检查。 |

浙公网安备 33010602011771号