一、反射的三种实现方式
- 对象.getClass()
- 类.class
- Class.forName("传入需要反射的类路径")
二、反射原理
1.Class.forName()方法实际上也是调用的CLassLoader(类加载器)来实现的。内部实际调用的方法是forName0(className, true, ClassLoader.getClassLoader(caller), caller)
- className:表示我们要加载的类名(这里是类的全路径名)
- true:指Class被加载后是不是必须被初始化。 不初始化就是不执行static的代码即静态代码,在这里默认为true,也就是默认实现类的初始化。
- ClassLoader.getClassLoader(caller):表示类加载器,到这你会发现forNanme其实也是使用的ClassLoader类加载器加载的。
- caller:指定类加载器。
2.classLoader
- 当调用类时会触发classLoader(JVM类加载器)
- JVM加载根据name到磁盘中找到对应的.class文件并加载到内存中
- 当.class对象加载入内存后,JVM会自动创建应该class对象。(一个类只会产生一个class对象,这个遵循了双亲委派模型)