什么是反射技术
1.Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类和对象的属性和方法。本质时JVM获取到class对象之后,在通过class对象进行反编译,从而获取对象的各种信息
2.Java属于先编译在运行的语言,程序中对象的的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类可能之前用不到所以没有加载到jvm。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。
3.Java反射机制可以动态方式获取到class相关信息 class中的成员方法、属性,反射技术灵活调用方法或者给我们的成员属性赋值 class.forName初始化我们的对象(创建我们的对象)
简单回顾下双亲委派机制
1.启动(bootstrap)类加载器:加载JVM自身工作需要的类,它由JVM自己实现。他会加载$JAVA_HOME/jre/lib下的文件 底层时c语言事件的
2.扩展(Extension)类加载器:它是JVM的一部分由sun.misc.LauncherExtClassLoader实现,他会加载ExtClassLoader实现 他会加载JAVA_HOME/jre/ext目录中的文件(或者由System.getProperty(“java.ext.dirs”)所指定的文件)底层是Java实现
3.应用 (AppClassLoader)类加载器:应用类加载器,我们工作中接触的最多的就是这个类加载器,他由sun.misc.Launcher AppClassLoader实现。它加载我们工程目录classpath下的class以及jar包底层Java实现
4.自定义类加载器:也就是用户自己定义的类加载器
反射技术的原理
反射的优缺点
优点:
在运行的时候获取各种内容,进行反编译,对Java这种先编译在运行的语言。能够让我们很方便灵活的创建代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象
缺点:
1.反射会消耗掉一定的系统资源,因此不需要动态的创建一个对象,那么就不需要反射;
2.反射调用方法时可以忽略权限检查,因此可能会被破坏封装性而导致安全问题
反射机制运用的场景
1.JDBC Class.forName(“com.mysql.jdbc.Driver”)反射技术加载mysql驱动
2.Spring底层基于反射初始化对象
3.(写一套自己)第三方框架扩展功能 代理设计模式反射技术
反射机制核心类
Java.lang.Class
Java.lang.reflect.Constrocter;
Java.lang.reflect.Filed;
Java.lang.reflect.Method;
Java.lang.reflect.Modifler;
反射机制API使用
1.获取Class:主要有三种方法
判断是否为某个类的实例
在之前我们使用instanceof关键字来判断是否为某个类的实例,同时我们也可以借助反射中的Class对象的isInstanceof方法来判断是否为某个类的实例他是一个native方法
通过反射创建对象
反射使用无参的构造方法初始化对象
使用Class对象的newInstance()方法来创建Class对象应用实例