目录
<1>通过实例对象.getClass()获取"Class"对象。
<3>通过全限定类名(Class.forName(""))获取"Class"对象。
<4>通过类加载(ClassLoader)获取"Class"对象。
一、Java的"反射"机制。
(1)生活中的"反射"例子。
- 日常生活中的反射是一种物理现象。(如通过照镜子反射自己的容貌、水面反射景物)通过反射,可以将应该虚像映射到实物,这样就可以获取实物的某些形态特征。
(2)Java的"反射"机制。
1、Java程序中"反射"的基本介绍。
- 在Java程序中也有反射。Java反射(Reflection)是一种强大的机制。
- 常规情况下程序都是通过类创建对象。而反射是将这个过程进行反转,变成通过实例化对象来获取所属类的信息。
- 将(类——>创建对象)反转成(对象——>获取类的信息)。
2、"反射"机制图解介绍。
- 官方对反射的解释:反射允许对封装类的字段(成员变量)、方法(成员方法)和构造函数(构造方法)的信息进行编程访问。
- "反射"图解的介绍。
- 简单说:反射其实就是可以直接从类中拿东西(常用的"成员变量"、"构造方法"、"成员方法"等等)。
- 既然反射可以拿去类中的东西,为什么不通过IO流一行一行的读取类中的东西?因为如果这样直接读取,不方便去区分(成员方法与构造方法)、(成员变量与局部变量)等。
3、"反射"常见的应用场景。
- 当我们在IDEA中写代码时的"部分提示"功能!
- 如创建了某个类的对象,在使用"对象.xxx"的时候。对应地方的下面会弹出能调用的相关的方法或成员变量。IDEA把它们全部都获取出来并下方进行提示。
- 包括调用某个有参方法时,idea会提示需要的形式参数个数或者是形式参数类型。这些都是通过Java的"反射"机制完成的。
二、如何使用Java的反射机制?
(1)Java程序运行机制与"反射"的关系(简要说明)。
- Java虚拟机编译已经写好并生成的.java源文件——>生成对应的.class文件(字节码文件)。然后将.class文件加载到内存中去执行。
- 当在执行.class文件的过程中,可能会需要用到其他类(其他的.class文件内容),这时就需要获取其他类的信息(通过反射机制获取类的信息)。
- 而Java虚拟机在加载.class文件时会产生一个Class类的对象去代表当前这个.class文件。可以通过从该Class的对象获取.class文件中的所有内容(即获得了该类的信息)。
- 所以反射操作的实现,必须借助这个重要的"Class"类。
(2)Java的"Class"类。
1、"Class"类的简单介绍。
- Java中的Class类是java.lang包的一部分。Class类代表了正在运行的Java应用程序中的类和接口。Class类的对象在JVM加载类时自动创建,每个类只有一个Class对象。
- Class类提供了很多的方法。通过Class类可以获取一个类的所有相应信息(属性、方法等)这里先不介绍,后面博客学习。
2、获取"Class"类实例对象的几种常见方式。
- 类的完全限定名是指包括了类所在的包名和类名的完整名称。完全限定名提供了一种无歧义的方式来唯一标识一个类。
<1>通过实例对象.getClass()获取"Class"对象。
//通过实例对象.getClass()获取"Class"实例对象 Student stu = new Student(); Class<? extends Student> stuClass01 = stu.getClass(); System.out.println("实例对象.getClass()获取Class对象:"+stuClass01);
<2>通过类名.class获取"Class"对象。
//通过类名.class获取"Class"实例对象 Class<?> stuClass02 = Student.class; System.out.println("通过类名.class获取实例对象"+stuClass02);
<3>通过全限定类名(Class.forName(""))获取"Class"对象。
//通过全限定类名(Class.forName(""))获取"Class"实例对象 try { Class<?> stuClass03 = Class.forName("com.fs.demo.Student"); System.out.println("全限定类名获取Class对象:"+stuClass03); } catch (ClassNotFoundException e) { throw new RuntimeException(e); }
<4>通过类加载(ClassLoader)获取"Class"对象。
//通过类加载(ClassLoader)获取"Class"对象 ClassLoader stuClassLoader = Student.class.getClassLoader(); Class<?> stuClass04 = null; try { stuClass04 = stuClassLoader.loadClass("com.fs.demo.Student"); System.out.println("通过类加载获取Class对象:"+stuClass04); } catch (ClassNotFoundException e) { throw new RuntimeException(e); }
- 程序的运行结果。
(3)Java"反射"机制的基本使用流程图。
- 所以某个类的信息,不是直接从.java源文件中直接获取的。而是从.class(字节码文件)中获取的。
- 所以需要学习如何获取"Class"(字节码文件对象),再学习如何从.class(字节码文件)中获取到字段、构造方法、成员方法。这三个东西获取出来后,再依次进行"解剖"获取其里面的各种信息。
- 关于Java"反射"机制的详细使用步骤在下篇博客进行学习。