一.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中。所以我们需要手动调用加载器加载。