getClass()和forName()的区别

getClass()和forName()都是用来获取Class对象引用的函数,他们返回同一个Class对象的引用。不同的是getClass()函数是Object对象的方法,如使用此函数,需要一个对象的引用来调用此方法。forName()函数是Class类中的一个静态方法,参数是全限定名(包名+类名),会抛出ClassNotFoundException异常,因此调用此函数,需要处理或声明抛出该异常。
用一段代码来演示上方讲解的两个函数的相同点和不同点。

package cn.zh.rtti;

public class CompareMethod {

    public static void main(String[] args) {
        // getClass()需要获取Class对象对应的对象的引用。是根类Objecct的函数
        CompareMethod compareMethod = new CompareMethod();
        Class c1 = compareMethod.getClass();

        Class c2 = null;
        try {
            // forName()是Class类的static方法,参数是全限定名,会抛出ClassNotFoundException异常
            c2 = Class.forName("cn.zh.rtti.CompareMethod");
        } catch (ClassNotFoundException e) {
            System.out.println("not find class");
            System.exit(1);
        }

        // getName()函数是Class类中的一个static方法,返回该Class对象的全限定名字符串
        System.out.println("I'm c1--------- name of class: " + c1.getName());
        System.out.println("I'm c2--------- name of class: " + c2.getName());

        // 通过.equals()函数得出c1和c2两个对象的内容是相同的
        // == 来比较c1和c2的地址,相同,由此得出getName()和forName()函数返回的是同一个Class对象的引用
        System.out.println("compared content between c1 and c2: " + c1.equals(c2));
        System.out.println("compared address between c1 and c2: " + (c1 == c2));
    }
}


为什么返回同一个Class对象的引用呢?
所有的类都是在对其第一次使用时,动态加载到JVM中的。当程序创建第一个对类的静态成员引用时,首先,JVM将使用类加载器检查这个类的Class对象是否已经加载,如果尚未加载,类加载器就会根据类名查找.class文件,加载这个字节码文件并生成Class对象,注意:所有的Class对象只生成一次,那就是JVM第一次调用静态成员时。
Java中构造函数也是一个static方法,只不过用来修饰构造器的static关键字被隐藏了,也就是说通过new关键字创建对象相当于调用了静态方法,也就会加载该对象的.class文件,并生成Class对象。forName()也是一个静态方法。所以,无论getClass()和forName谁先被调用,还是调用几次,得到的都是同一个Class对象的引用。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值