前言:
java程序在计算机中运行有,三个主要的阶段,代码阶段/编译阶段,Class类阶段(加载阶段),runtime运行阶段。在不同的阶段我们可以通过不同的方法来获取class对象。
一 通过Class类静态方法forName(“类包名.类名”)获取实例
此方法的前提是,已知一个类的全类名,且该类在类路径下,可通过class类的静态方法forName()获取,可能抛classnotfoundException. 。
实例:
//1 Class.forName
String classAllPath = "com.test.Car"; //通过读取配置文件获取
Class<?> cls1 = Class.forName(classAllPath);
应用场景:多用于配置文件, 读取全路径,加载类
二 使用类名.class获取
已知具体的类,通过类的class获取,该方式最为安全可靠,程序性能最高
实例:
//2 类名.class,应用场景,有对象实例
Class cls2 = Car.class;
System.out.println(cls2);
应用场景:多用于参数传递,比如通过反射得到对应构造器对象。
三 通过对象.getclass()获取
已知某个类的实例 ,调用该实例的getclass()方法获取class对象。
实例:
//3. 对象.getClass(), 应用场景,有对象实例
Car car = new Car();
Class cls3 = car.getClass();
System.out.println(cls3);
应用场景:通过创建好的对象,获取class对象。
四 通过类加载器获取对象
通过类加载器来获取对象,首先得获取类加载器,再通过类加载器来获取class对象。
实例:
//4.通过类加载器来获取类的class对象
//(1)先获得类加载器 car
ClassLoader classLoader = car.getClass().getClassLoader();
//(2)通过类加载器获取Class对象
Class cls4 = classLoader.loadClass(classAllPath);
System.out.println(cls4);
五 基本数据类型获取class对象
实例:
//5.基本数据 (int,char,boolean,float,double,byte,long,short) 按如下方式获得class对象
Class<Integer> integerClass = int.class;
Class<Character> characterClass = char.class;
Class<Boolean> booleanClass = boolean.class;
System.out.println(integerClass); //int
六 基本数据类型对应的包装类通过.TYPE获取
实例:
//6.基本类型对应的包装类,可以通过 .TYPE 得到Class类对象
Class<Integer> type = Integer.TYPE;
Class<Character> type1 = Character.TYPE;//其它包装类Boolean,Double,long,byte等等。
总结
我们将前面4种方法打印
//cls1,cls2,cls3,cls4 其实是同一个对象
System.out.println(cls1.hashCode());
System.out.println(cls2.hashCode());
System.out.println(cls3.hashCode());
System.out.println(cls4.hashCode());
结果:
4种方法获得的对象都是一样的! 这是因为在内存里边,不管怎么处理,在class类对象/堆里只有,对于一个类而言只有一个class对象与之对应