Java反射
-
概念:
- 因为加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个class对象)这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像是一面镜子,透过镜子可以看到类的机构,因此形象的称之:反射
-
核心:
- Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息
- Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态创建对象并调用其属性,不需要提前在编译器知道运行的对象是谁
-
优点:
- 在运行时获得类的各种内容,进行反编译,对于Java这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象
-
缺点:
- ①:反射会消耗一定的系统资源,因此,如果不需要动态的创建一个对象,那么就不需要用反射
- ②:反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题
-
用途:
- ①:实现.class文件到java文件的反编译
- ②:通过反射机制访问java对象的属性、方法、构造方法等
- ③:常用的IDEA、Eclipse等开发工具的快速实现(我们开发过程中 在某一个对象后按“点”总能列出其方法或者属性)这个就是用到了反射
- ④:最重要的用途就是开发各种通用框架,为了保证框架的通用性,他们可能需要根据配置文件加载不同的类或者对象,调用不同的方法,此时就需要使用反射,运行时动态加载需要加载的对象
- ⑤:在struts2框架中,在struts.xml里去配置Action,当我们请求login.action时,那么StrutsPrepareAndExecuteFilter就回去解析struts.xml文件,从action中查找出name为login的Action,并根据class属性创建创建对应的action实例,并用invoe方法来调用execute方法。这里就用到了反射。【配置文件与Action建立了一种映射关系,当View层发出请求时,请求会被StrutsPrepareExecuteFilter拦截,然后StrutsPrepareExecuteFilter会去动态地创建Action实例】
- ⑥:Class.forName(“com.mysql.jdbc.Driver”) 动态加载mysql驱动,用到的也是反射
-
常用的类
- ①:Java.lang.Class
- ②:Java.lang.reflect.Constructor
- ③:Java.lang.reflect.Field
- ④:Java.lang.reflect.Method
- ⑤:Java.lang.reflect.Modifier