Class 相关的一些理解

加载一个 class 文件的分为 3 步

  • 装载:查找相应的class文件并装载二进制数据。
  • 连接:执行验证,准备,以及解析(可选)
    • 验证:确保被导入类型的正确性
    • 准备:为类变量分配内存,并将其初始化为默认值
    • 解析:把类型中的符号引用转化为直接引用
  • 初始化:激活类的静态变量、初始化 Java 代码、执行静态代码块

loadClass() 和 Class.forName() 的区别

  • loadClass(className): 它调用的方法是它的重载方法 ClassLoader.loadClass(String name,boolean resolve) ; 如果 resolve 为 false 则表示目标对象被装载后不进行链接,这就意味这不会去执行类的连接和初始化。缺省该参数时为 false。注意:resolve=true 时,则保证已经装载,而且已经连接了。resolve=false 时,则仅仅是去装载这个类,不关心是否连接了,所以此时可能被连接了,也可能没有被连接(假如之前这个类被同一个 classLoad 加载并初始化了,那么将返回之前初始化过的类);
  • Class.forName(className) : 它调用的是它的重载方法 Class.forName(String name,boolean initialize,ClassLoader loader); 如果 resolve 为 true, 则在加载类之后执行初始化操作。缺省该参数时为 ture。注意 resolve = false 时,则不会初始化,但是不关心是否被连接。(假如之前这个类被同一个 classLoad 加载并初始化了,那么将返回之前初始化过的类);

关键字 new 和 Class.newInstance()的区别

  • new : 强类型,相对高效,能调用任何public构造。
  • newInstance : 弱类型,低效,只能调用无参构造。但是更灵活

你可能感兴趣的:(Class 相关的一些理解)