[TOC]
概念
Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个属性和方法,这种功能称为java语言的反射机制
1 | 每个类都有一个 Class 对象,包含了与类有关的信息。当编译一个新类时,会产生一个同名的 .class 文件,该文件内 |
类对象 和 java.lang.reflect 一起对反射提供了支持,java.lang.reflect 类库主要包含了以下三个类:
Field :可以使用 get() 和 set() 方法读取和修改 Field 对象关联的字段;
Method :可以使用 invoke() 方法调用与 Method 对象关联的方法;
Constructor :可以用 Constructor 创建新的对象。
优缺点
优点:
可扩展性 :应用程序可以利用全限定名创建可扩展对象的实例,来使用来自外部的用户自定义类。
方便性: 可以写在配置文件里,直接修改配置文件就行了
spring.txt
1 | class=reflection.Service1 |
1 | package reflection; |
缺点:
性能开销 :反射涉及了动态类型的解析,所以 JVM 无法对这些代码进行优化。因此,反射操作的效率要比那些
非反射操作低得多。
内部暴露 :由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使
用反射可能会导致意料之外的副作用,这可能导致代码功能失调并破坏可移植性。
获取类对象
1 | package reflection; |
创建对象
1 | package reflection; |
访问属性
对于private修饰的成员,需要使用setAccessible(true)才能访问和修改。不在此知识点讨论。
1 | package reflection; |
1 | getField和getDeclaredField的区别 |
调用方法
1 | package charactor; |
1 | package reflection; |