java.lang.Class解析
java.lang.Class
1、java.lang.Class的概念
当一个类或接口被装入的JVM时便会产生一个与之关联的java.lang.Class对象,java.lang.class类就是用来封装被装入JVM中的类的信息。 JVM为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。
Java的每个基本类型(boolean、byte、char、short、int、long、float 和 double)都有一个Class对象,数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
2、Class对象的获取
有三种方法可以得到一个class对象
2.1、调用Object类的getClass()方法来得到Class对象
所有Java对象都具备这个方法,该方法返回调用该方法的对象所属类关联的Class对象
Person person1 = new Person(); Class c1 = person1.getClass(); System.out.println(c1.getName()); //再新建一个person的class对象,观察看看同一个类不同的对象生成的class对象是否相同 Person person2 = new Person(); Class c2 = person2.getClass(); System.out.println(c1==c2); // (1)结果发现返回true,说明对于相同的类,JVM只会载入一次,而与该类对应的Class对象也只会存在一个,无论该类实例化了多少对象。 List list = new ArrayList(); System.out.println(list.getClass().getName()); // (2)结果发现返回java.util.ArrayList 说明当一个对象被其父类的引用或其实现的接口类型的引用所指向时,getClass方法返回的是与对象实际所属类关联的Class对象。
2.2、 使用.class的方式
对于一个JAVA类型,直接使用类名.class就可以得到一个class对象
Class c3 = Person.class; Class c4 = int.class; Class c5 = int[].class; System.out.println(c3.getName()); // 输出 com.pjf.Person System.out.println(c4.getName()); // 输出 int System.out.println(c5.getName()); // 输出 [I 注:可以看到数组返回奇怪的名字、 System.out.println(c5.getComponentType()); //输出 int 这时候返回就正确了
2.3使用Class类的中静态forName()方法
使用Class类的中静态forName()方法获得与字符串对应的Class对象。
Class c6=Class.forName("com.pjf.Person");
System.out.println(c6.getName());
3、java.lang.Class类的方法
1、getName()
返回Class对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
2、newInstance()
Class还有一个有用的方法可以为类创建一个实例,这个方法叫做newInstance()。例如:
x.getClass.newInstance(),创建了一个同x一样类型的新实例。newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。
3、getClassLoader()
返回该类的类加载器。
4、getComponentType()
返回表示数组组件类型的 Class。
5、getSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
6、isArray()
判定此 Class 对象是否表示一个数组类。