简单谈谈我对Java 中 Class.forName()、Class.class、实例对象.getClass() 三种获取字节码对象的理解?(内含代码分析和总结)
首先得明白的知识点:
1静态属性初始化加载类的时候初始化(只会初始化一次),而非静态属性的初始化就是new类实例对象的时候初始化的
2三种获取字节码对象的共同点就是都会预先的判断内存是否已经加载此类,弱没有加载,则会把.class文件装入到内存,若是加载了,则会根据class文件生成实例对象
谈谈 我对Java 中 Class.forName()、Class.class、实例对象.getClass() 三者的理解?
1Class.class 的形式会使 JVM 将使用类装载器将类装入内存(前提是类还没有装入内存),不做类的初始化工作(静态初始化和动态初始化都不会做),返回 Class 对象。
1 public class Demo01 { 2 public static void main(String[] args) { 3 //Class.class的方式 4 Class<DemoClass> clazz = DemoClass.class; 5 System.out.println(clazz); 6 } 7 } 8 9 10 class DemoClass{ 11 //1构造函数 12 public DemoClass() { 13 System.out.println("我是构造函数"); 14 } 15 16 //2静态代码块 17 static { 18 System.out.println("我是静态代码块"); 19 } 20 21 //3非静态代码块 22 { 23 System.out.println("我是非静态代码块"); 24 } 25 } 26 27 Result: 28 class com.zhuhuicong.classobject.DemoClass
2Class.forName(该类的权限定名) 的形式会装入类并做类的静态初始化,返回 Class 对象。
1 public class Demo02 { 2 public static void main(String[] args) { 3 //Class.forName()的方式,注意这里传入的是全限定名 4 try { 5 Class<?> clazz = Class.forName("com.zhuhuicong.classobject.DemoClass"); 6 System.out.println(clazz); 7 } catch (ClassNotFoundException e) { 8 e.printStackTrace(); 9 } 10 } 11 } 12 13 class DemoClass{ 14 //1构造函数 15 public DemoClass() { 16 System.out.println("我是构造函数"); 17 } 18 19 //2静态代码块 20 static { 21 System.out.println("我是静态代码块"); 22 } 23 24 //3非静态代码块 25 { 26 System.out.println("我是非静态代码块"); 27 } 28 } 29 30 Result: 31 我是静态代码块 32 class com.zhuhuicong.classobject.DemoClass
3实例对象.getClass() 的形式会对类进行静态初始化、非静态初始化,返回引用运行时真正所指的对象(因为子对象的引用可能会赋给父对象的引用变量中)所属的类的 Class 对象。
1 public class Demo03 { 2 public static void main(String[] args) { 3 //实例对象.getclass()方式 4 Class<? extends DemoClass> clazz = new DemoClass().getClass(); 5 System.out.println(clazz); 6 } 7 } 8 9 class DemoClass{ 10 //1构造函数 11 public DemoClass() { 12 System.out.println("我是构造函数"); 13 } 14 15 //2静态代码块 16 static { 17 System.out.println("我是静态代码块"); 18 } 19 20 //3非静态代码块 21 { 22 System.out.println("我是非静态代码块"); 23 } 24 } 25 26 Result: 27 我是静态代码块 28 我是非静态代码块 29 我是构造函数 30 class com.zhuhuicong.classobject.DemoClass