1. Class类简介
Java反射的源头是一个Class类,每一个类在内存中都有且只有一个Class对象。
java源文件经过编译后生成一个.class字节码文件,然后JVM虚拟机运行时是去加载.class字节码文件。JVM加载时会为每一个类创建一个Class类型的对象(Class本身也是一个类),一个Class对象包含了特定的某个结构(类 / 接口 / 枚举 / 注解 / 基础数据类型 / 空类型 / 数组 …)的有关信息。
-
Class本身也是一个类
-
Class对象只能由系统建立对象
-
一个加载的类在JVM中只会有一个Class实例。
-
一个Class对象对应的是一个加载到JVM的一个.class字节码文件
-
每个类的实例都会记得自己是由哪个Class所产生的
-
通过Class可以完整地得到一个类的所有被加载的结构
-
Class类是反射的根源,针对任何你想动态加载、运行的类,唯有限获得相应的Class对象。
2. Class类基本信息
-
首先定义三个基础类,Person、Student、Teacher类。
class Person{ private String name; public Person(){} public Person(String name) { this.name = name; } } class Student extends Person{ public Student(){ super("学生!"); } } class Teacher extends Person{ public Teacher(){ super("教师!"); } }
-
获取Class类的几种方式:通过实例化对象获取、类名.Class获取、反射获取,还可以利用类加载器获取。由于每一个类在内存中有且只有一个Class类对象,所以获取到的hashcode值都是一样的。
@Test public void test1() throws Exception{ //1. 实例化对象获取 Person student = new Student(); Class c1 = student.getClass(); System.out.println(c1.hashCode()); //2. 类名.Class Class c2 = Student.class; System.out.println(c2.hashCode()); //3. 反射获取 Class c3 = Class.forName("JVM.SevenClassLoader.Student"); System.out.println(c3.hashCode()); //4. 内置基本数据类型可以直接.TYPE System.out.println(Integer.TYPE); //5. 获取父类 System.out.println(c2.getSuperclass()); }
-
所有类的Class类最后都来自同一个Class类型(Class本身也是一个类型)
@Test public void test2(){ //1. java.lang.String类 Class c1 = String.class.getClass(); System.out.println(c1 + " = " + c1.hashCode()); //2. Student类 Class c2 = Student.class.getClass(); System.out.println(c2 + " = " + c2.hashCode()); //3. Teacher类 Class c3 = Teacher.class.getClass(); System.out.println(c3 + " = " + c3.hashCode()); //4. Person类 Class c4 = Person.class.getClass(); System.out.println(c4 + " = " + c4.hashCode()); }
-
获取所有常见类型的Class类对象
@Test public void test3(){ Class c1 = String.class; //String Class c2 = Object.class; //类 Class c3 = int[].class; //一位数组 Class c4 = int[][].class; //二维数组 Class c5 = Comparable.class; //接口 Class c6 = Deprecated.class; //注解 Class c7 = ElementType.class; //枚举 Class c8 = void.class; //void Class c9 = Class.class; //Class System.out.println(c1); System.out.println(c2); System.out.println(c3); System.out.println(c4); System.out.println(c5); System.out.println(c6); System.out.println(c7); System.out.println(c8); System.out.println(c9); }