获取Class类对象的几种方式

本文详细介绍了四种获取Java Class对象的方式:通过类名、对象引用、Class.forName()和ClassLoader.loadClass(),并探讨了反射机制和Class类的常用方法。此外,比较了Class.forName()与ClassLoader.loadClass()在类加载时机和初始化上的区别。
获取Class对象的几种方式
一、获取Class对象的四种方式
1、通过类.class获取
Class<Reflect> class1 = Reflect.class;
2、通过对象.getClass()获取
Class<? extends Reflect> class2 = new Reflect().getClass();
3、通过类Class.forName()获取
Class<?> class3 = Class.forName("interview.Reflect");
4、通过类ClassLoader.loadClass()获取
Class<?> class4 = Reflect.class.getClassLoader().loadClass("interview.Reflect");
二、关于获取Class对象的一些引伸
1、反射

反射机制是在运行状态中,对于任意一个类,都能知道其所有属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制

2、Class类中常用方法

getName():返回String形式的该类的名称。
newInstance():根据某个Class对象产生其对应类的实例,它调用的是此类的默认构造方法(没有默认无参构造器会报错)
getClassLoader():返回该Class对象对应的类的类加载器。
getSuperClass():返回某子类所对应的直接父类所对应的Class对象
getConstructor(Class[]) :返回当前 Class 对象表示的类的指定的公有构造子对象。
getConstructors() :返回当前 Class 对象表示的类的所有公有构造子对象数组。
getDeclaredConstructor(Class[]):返回当前 Class 对象表示的类的指定已说明的一个构造子对象。
getDeclaredConstructors() :返回当前 Class 对象表示的类的所有已说明的构造子对象数组。
getDeclaredField(String) :返回当前 Class 对象表示的类或接口的指定已说明的一个域对象。
getDeclaredFields() :返回当前 Class 对象表示的类或接口的所有已说明的域对象数组。
getDeclaredMethod(String, Class[]) :返回当前 Class 对象表示的类或接口的指定已说明的一个方法对象。
getDeclaredMethods() :返回 Class 对象表示的类或接口的所有已说明的方法数组。
getField(String) :返回当前 Class 对象表示的类或接口的指定的公有成员域对象。
getFields() :返回当前 Class 对象表示的类或接口的所有可访问的公有域对象数组。
getInterfaces() :返回当前对象表示的类或接口实现的接口。
getMethod(String, Class[]) :返回当前 Class 对象表示的类或接口的指定的公有成员方法对象。
getMethods() :返回当前 Class 对象表示的类或接口的所有公有成员方法对象数组,包括已声明的和从父类继承的方法。
isInstance(Object) :此方法是 Java 语言 instanceof 操作的动态等价方法。
isInterface() :判定指定的 Class 对象是否表示一个接口类型
isPrimitive() :判定指定的 Class 对象是否表示一个 Java 的基类型。

3、Class.forName()和ClassLoader.loadClass()的区别
  • foranme在类加载的时候会执行静志代码块
  • loadclass只有在调用newInstance方法的时候才会执行静态代码块
  • 初始化不同:Class.forName()会对类初始化,而loadClass(只会装在或链接。可见的效果就是类中静态初始化段及字节码中对所有静态成员的初始工作的执行(这个过程在类的所有父类中递归地调用).这点就与ClassLoader.loadClass()不同. ClassLoader.loadClass(加载的类对象是在第一次被调用时才进行初始化的。你可以利用上述的差异.比如,要加载一个静态初始化开销很大的类,你就可以选择提前加载该类(以确保它在classpath下),但不进行初始化,直到第一次使用该类的域或方法时才进行初始化
  • 类加载器不用:Class.forName(String)方法(只有一个参数),使用调用者的类加载器来加载,也就是用加载了调用forName方法的代码的那个类加载器。当然,它也有个重载的方法,可以指定加载器。相应的,ClassLoader.loadClass()方法是一个实例方法(非静态方法),调用时需要自己指定类加载器,那么这个类加载器就可能是也可能不是加载调用代码的类加载器(调用代用代码类加载器通getClassLoaderoQ获得)
### Java获取 Class 对象几种方式Java 编程中,Class 对象用于表示运行时类的信息,是反射机制的核心。以下是获取 Class 对象几种常见方法: 1. **通过对象调用 `getClass()` 方法** 如果已经有一个类的实例对象,可以直接调用该对象的 `getClass()` 方法来获取其对应的 Class 对象。这是一个非常直接的方式,适用于对象已经创建的情况[^1]。 ```java Object obj = new String("example"); Class<?> clazz = obj.getClass(); ``` 2. **通过 `.class` 语法** 如果已知具体的类名,可以直接使用类名后加 `.class` 的方式获取对应的 Class 对象。这种方式性能最高且最为安全可靠[^3]。 ```java Class<String> clazz = String.class; ``` 3. **通过 `Class.forName(String className)` 方法** 使用 `Class.forName()` 方法可以通过传递类的全限定名(包括包名)来动态加载并返回对应的 Class 对象。此方法通常用于需要动态加载类的场景,但需要注意可能抛出 `ClassNotFoundException` 异常[^4]。 ```java try { Class<?> clazz = Class.forName("java.lang.String"); } catch (ClassNotFoundException e) { e.printStackTrace(); } ``` 4. **通过 `ClassLoader.loadClass(String className)` 方法** 类加载器的 `loadClass()` 方法也可以用来加载指定名称的类,并返回其 Class 对象。与 `Class.forName()` 不同的是,`loadClass()` 不会初始化类[^2]。 ```java try { Class<?> clazz = ClassLoader.getSystemClassLoader().loadClass("java.lang.String"); } catch (ClassNotFoundException e) { e.printStackTrace(); } ``` 5. **通过基本类型的包装类中的 `TYPE` 字段** 对于基本数据类型(如 `int`, `boolean` 等),可以通过其对应的包装类中的 `TYPE` 字段获取Class 对象[^5]。 ```java Class<?> intClass = Integer.TYPE; Class<?> booleanClass = Boolean.TYPE; ``` 以上方法各有适用场景,开发者可以根据实际需求选择合适的方式获取 Class 对象。 ### 注意事项 - 使用 `Class.forName()` 和 `ClassLoader.loadClass()` 时需要注意处理可能抛出的 `ClassNotFoundException` 异常。 - 如果只需要静态获取类信息,推荐使用 `.class` 语法,因为它更高效且不会触发类的初始化。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值