Java中获取Class对象的四种方法

什么是Class对象
Class类位于java核心包lang包中,它是反射的源头。Class对象用于记录每个类的运行时数据结构,或者说是在内存中访问类的静态数据的接口,每个类都有一个唯一的Class对象。Class对象不能直接通过new来获取,因为其构造器是私有的,下面是Class类的源码:

private Class(ClassLoader loader) {
        // Initialize final field for classLoader.  The initialization value of non-null
        // prevents future JIT optimizations from assuming this final field is null.
        classLoader = loader;
    }

类加载过程将.class字节码文件加载到内存中,并将静态数据转化为方法区的运行时数据结构,并且Java虚拟机以及通过调类加载器中的 defineClass 方法自动在堆中构造这个类对应的Class对象

哪些类型拥有Class对象
在这里插入图片描述
说明:
如果两个数组对应的维数以及元素的数据类型相同的话,它们共享同一个Class对象

        int[] arrayA = new int[5];
        int[] arrayB = new int[2];
        System.out.println(arrayA.getClass().hashCode());
        System.out.println(arrayA.getClass().hashCode());

二者的hash值相同
在这里插入图片描述

获取Class对象的四种方法

方式一:调用运行时类的属性:.class

Class clazz = Person.class;
System.out.println(clazz);

方式二:调用运行时类的对象:调用getClass()方法

Person p = new Person();
Class clazz1 = p.getClass();
System.out.println(clazz1)

方式三:调用Class的静态方法:forName(String classPath)方法`

Class clazz2 = Class.forName("com.study1.Person");
Class aClass = Class.forName("java.lang.String");
System.out.println(clazz2);
System.out.println(aClass);

方式四:使用类的加载器:ClassLoader`

ClassLoader classLoader = ClassDemo.class.getClassLoader();
Class<?> aClass1 = classLoader.loadClass("com.study1.Person");
System.out.println(aClass1);

加载到内存中的运行时类,会缓存一定的时间。在此时间之内,我们可以通过不同的方式来获取此运行时类。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以使用以下方式获取Class对象: 1. 使用`Class.forName(String className)`方法:该方法根据类的全限定名(包含包名)获取Class对象,如果类不存在或无法加载,会抛出`ClassNotFoundException`异常。例如,`Class.forName("java.lang.String")`返回`String`类的Class对象。 2. 使用`.class`语法:使用该语法可以在编译时获取Class对象,例如,`String.class`返回`String`类的Class对象。 3. 使用对象的`.getClass()`方法:该方法返回对象Class对象。例如,`"hello".getClass()`返回`String`类的Class对象。 示例代码: ```java public class GetClassExample { public static void main(String[] args) { try { // 使用Class.forName()方法获取Class对象 Class<?> stringClass = Class.forName("java.lang.String"); System.out.println("Class.forName() method: " + stringClass); // 使用.class语法获取Class对象 Class<?> stringClass2 = String.class; System.out.println(".class syntax: " + stringClass2); // 使用对象的getClass()方法获取Class对象 String str = "hello"; Class<?> stringClass3 = str.getClass(); System.out.println("getClass() method: " + stringClass3); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } ``` 输出结果: ``` Class.forName() method: class java.lang.String .class syntax: class java.lang.String getClass() method: class java.lang.String ``` 注意:以上方法获取的是Class对象,不同于对象本身,如果需要获取对象的实例信息,可以使用反射机制的相关方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值