1、什么是反射?
答:通过程序来访问任意类的能力
2、为什么使用反射创建对象 的效率 小于(<) 直接new()对象?
答:1)反射调用会进行一系列安全性校验
2)反射需要调用一系列的native方法来实现
3)寻找Class字节码的过程,比如通过ClassName找到对应的字节码Class,然后进行加载、解析,也会比较慢,而new的方式则无需寻找,因为在Linking的解析阶段已经将符号引用转为了直接引用
Class<?> aClass = Class.forName("全路径") 做了什么? -》找到字节码文件 —》 加载字节码文件 (类加载机制) -》 加载到运行时数据区域(产生一个Class类型的对象) ps:Class的对象,并不是Class类型的实例,也就是说并不是普通的对象
native方法的调用forName0( className , true , ClassLoader.getClassLoader(caller) , caller);
User user= (User)aClass.newInstance(); //这一步之后才是咱们说的普通的对象
New 的关键字,是不需要这么过程的,所以性能比较高
3、类加载机制 ClassLoad
答:装载(Load)-> 连接(Link -> 验证veirly、准备、解析) -> 初始化Initialize -> 使用Use -> 卸载Unload
4、符号引用和直接引用?
答:略长比较麻烦,自行查找吧
5、clazz.newInstance() 的本质是什么?
答:从两个层面来看
Jdk层面:Constructor.newInstance()
Jvm层面:instanceKlass() -> instanceOopDesc -> OopDesc