在学习Java的过程中会遇到关于反射技术知识学习,这个技术在学习的过程中有一定的难度,今天就和大家一起研究下反射最重要的一个类Class。
介绍Class类: 在学习Java过程中我们知道书写的任何类、接口、枚举、注解等程序经过JDK中的javac命令编译之后都会在指定的硬盘目录下生成对应的class文件(就是字节码文件,为了通俗易懂这里称为class文件)。而这些class文件针对JVM而言就是一类可以直接执行的程序文件,学习Java面向对象过程中知道,任何存在的事物都可以使用对应的类或者接口等形式进行封装描述,同样道理针对class文件这类事物,在Java中使用了Class类进行封装和描述的(如下图)。
介绍获取Class对象: 通过上图可以知道任何class文件都可以使用Class类进行描述封装,也就是说任何一个class文件都可以理解成Class类的一个实例对象。当我们在程序获取到某个类的对应的class文件本身,其实就等价于获取到Class类的一个实例。
Java中提供三种方式可以获取到Class类的一个实例对象(某个类的class文件对象)。
n 当获取到某个类的真实对象,可以使用Object类中的getClass获取。例如:当有一个Person类的时候,假设可以通过new关键字创建出Person对象,就可以通过Person对象调用getClass获取到Person的class文件对象。
public static void method_1() {
Person p = new Person("上海传智播客",3);
Class clazz = p.getClass();
System.out.println(clazz);
}
n 在Java中的任何类型都有一个对应的静态属性class,可以直接获取到某个类型对应的class文件(Class对象)。
public static void method_2() {
Class clazz = Person.class;
System.out.println(clazz);
Class clazz2 = int[].class;
System.out.println(clazz2);
Class clazz3 = double.class;
System.out.println(clazz3);
}
n 在我们学习Java的过程中,我们知道当需要获取任何类对应的对象时可以使用这个类的构造方法或者这类中的某些静态方法等方式获取,在Class的api中提供了静态成员方法forName可以直接获取到Class对象。
public static void method_3() throws Exception {
Class clazz = Class.forName("cn.itcast.sh.domain.Person");
System.out.println(clazz);
Class clazz2 = Class.forName("java.util.Map");
System.out.println(clazz2);
}
Class对象能干什么? Class对象它表示的具体的某个Java源代码在编译之后生成的class文件对象,而这个class文件中就保存着当前这个类或者接口的所有成员信息,因此当在程序中获取到了对应的class文件对象(Class对象)就可以动态的去得到这个类或者接口中描述的成员变量、成员方法、构造方法、静态代码块等成员信息。因此只要在程序能够获取到Class对象,就可以去得到任何类中的任何信息。
Java中的反射技术到底能干什么呢? 反射技术主要使用在框架等功能性程序的底层,主要的目的是可以提供扩展性非常强的通用功能。反射技术的工作原理也十分的简单:我们在使用别的功能性程序或者框架时,需要把我们的程序配置在指定的文件(配置文件)中,在运行程序时,框架就会自动的去读取配置文件中的配置信息,通过上述的三种方式种的某一种获取到对应class文件对象,进而解析出其中的成员信息,最终让这些成员信息可以动态的执行起来。
如果想知道具体如何获取class文件中的成员信息,请关注传智播客官方论坛或者微信账号。