Java反射中的forName()和.class方法的区别

一.java反射的三种方式:(Test为一个类)

1.Class.forName(“全路径”)//会调用类加载器
2. Test.class//不会调用类加载器
3.getClass()方法
注:它们都会返回一个Class对象,但用过的很多朋友可能都会有一个疑问,Class对象到底是在什么地方创建的,以下是我自己的一些理解:

二.Class对象的定义:

1.官方定义:Class对象是由JAVA虚拟机通过类加载器及调用类加载器中的一个defineClass方法创建的,Class类没有构造方法。–这里的Class对象为加载到内存中的Class对象
2.万物皆对象:在.java文件编译为.class文件时,里面存放的不仅有该类的属性,方法等信息或叫类信息,还有一个Class对象,也称作一个.class文件就是一个Class对象。–这里的Class对象是放在磁盘上的,没有加载到内存。

三.反射中存在的疑惑:

1.Class.forName():查看源码:

@CallerSensitive
    public static Class<?> forName(String className) throws ClassNotFoundException {
        Class<?> caller = Reflection.getCallerClass();
        return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
    }

在这里,我们可以看见,Class.forName会自动调用类加载器,进行加载,准备,初始化等操作,在初始化过程中,会调用静态方法。并返回一个Class对象。这里的Class对象就是放在内存里的Class对象。

2.Test.class(Test为编写的一个类)
这里的.class返回的也是一个Class对象,但这个Class对象并没有调用类加载器,也就没有被加载到内存中,实列化必须调用newInstance()方法来实例化。可能看到这里会发出疑问,不是说Class对象是在调用类加载器才会被创建吗?那么你可以把这里理解为:这个Class对象为磁盘上的Class对象,还没有加载到JVM中。所以我们需要手动调用加载器加载。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值