1.反射机制的概念
Java语言属于先编译再运行的语言,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。 Java反射机制的核心是在程序运行时动态加载类的详细信息即动态地创建对象并调用其属性,不需要在编译期知道运行的对象是谁。
2.反射的原理
Class对象的由来是将.class文件读入内存,并为之创建一个Class对象。
类的生命周期:
类的加载过程:(eg:Student)
1.当执行new Student(),会触发JVM加载Student.class
2.JVM从本地磁盘中找到Student.class文件并加载到JVM内存中
3..class文件加载入内存后,JVM会自动加载创建一个class对象。一个类只会产生一个class对象
Java反射的本质理解:得到class对象后,反向获取Student对象的各种信息。
3.反射的优缺点
1.优点:a.在运行时获得类的各种内容(包括成员变量,成员方法,构造器等),并且可以操纵类的字段、方法、构造器等部分。对其进行反编译,对于Java这种先编译再运行的语言,能够让我们方便地创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面对对象。b.反射非常强大,它甚至能直接操作程序的私有属性。原本被private封装的资源只能类内部访问,外部是不行的,但这个规定被反射赤裸裸的打破了。
2.缺点:a.反射会消耗一定的系统指引,所以如果不需要动态地创建一个对象,那么就不需要用反射;b.反射调用方法可以忽略权限调查,因此可能破坏封装性而导致安全问题。
4.反射的用途:
1.反编译将.class转换成.java
2.在运行时获得类的各种内容(包括成员变量,成员方法,构造器等),并且可以操纵类的字段、方法、构造器等部分,对其进行反编译。
3.在IDEA或Eclipse中,当我们输入对象或者类,通过点号可直接调用属性和方法,这就是反射。
4.反射多被应用在框架中。eg:Spring框架,这是一个非常专业且功能强大的产品,能够帮我们创建和管理对象,无需手动new对象,直接从Spring提供的容器中Beans获取即可。Beans底层就是一个Map<String,Object>,最终通过getBean(“user”)来获取。这其中最核心的实现就是反射。
5.加载数据库驱动的,也是反射
Class.forName("com.mysql.jdbc.Driver");//动态加载mysql驱动
5.反射机制常用的类:
Java.lang.Class;
Java.lang.reflect.Field;
Java.lang.reflect.Constructor;
Java.lang.reflect.Method;
Java.lang.reflect.Modifier;
六、反射的三大方法
(1)Object-->getClass
(2)任何数据类型(包括基本的数据类型)都有一个“静态”的class属性,直接.class
(3)通过class类的静态方法:forName(String className)(最常用)