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()多用于对象类型检查。
posted @ 2025-06-21 15:07  joudys  阅读(97)  评论(0)    收藏  举报