反射
反射
——框架设计的灵魂
反射:将类的各个组成部分封装为其他对象。
优点:
- 可以在程序运行过程中,操作这些对象
- 可以接耦,提高程序可扩展性
获取Class对象的三种方式
-
Class.forName("全类名")
将字节码文件加载进内存,返回Class对象多用于配置文件,将类名定义在配置文件中。读取文件,加载类。
-
类名.class
通过类名的属性class获取多用于参数传递
-
对象.getClass()
该方法在Object中定义了多用于对象获取字节码
这三种方式分别对应了java代码的三个时期
同一个字节码(.class)文件在一次程序运行过程中,只会被加载一次,不论通过哪种方式获得的class对象都是同一个。
Class对象功能
获取功能
-
成员变量
Field[] getFields()
获取所有public修饰的成员变量Field getField(String name)
获取指定名称的public修饰的成员变量Field[] getDeclaredFields()
获取所有成员变量,不考虑修饰符Field getDeclaredField(String name)
获取指定成员变量,不考虑修饰符对于非public的变量,在使用前,需要忽略访问权限修饰符的安全检查
field.setAccessible(true)
也称暴力反射 -
构造方法
Constructor<?>[] getConstructors()
Constructor<T> getConstructor(Class<?>... var1)
Constructor<?>[] getDeclaredConstructors()
Constructor<T> getDeclaredConstructor(Class<?>... var1)
-
成员方法
Method[] getMethods()
Method getMethod(String var1, Class<?>... var2)
Method[] getDeclaredMethods()
Method getDeclaredMethod(String var1, Class<?>... var2)
-
类名
String getName()
通俗地讲,反射就是将传统的对象调用方法、访问变量的执行过程,在形式上转换为了方法、变量拿到自己所属的对象然后去执行操作。
-
Field:成员变量
-
设置值
void set(Object var1, Object var2)
-
获取值
Object get(Object var1)
-
忽略访问权限修饰符的安全检查
void setAccessible(boolean var1)
-
-
Constructor:构造方法
-
创建对象
newInstance(Object... var1)
如果使用空参数构造方法创建对象,操作可以简化:用Class对象的
newInstance()
-
-
Method:方法对象
-
执行方法
invoke(Object var1, Object... var2)
-
获取方法名称
String getName()
-
案例
- 需求:写一个“框架”,在不能改变该类的任意代码的前提下,可以创建任意类的对象,并且执行其中任意方法
- 实现:
- 配置文件
- 反射
- 步骤
- 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
- 在程序中加载读取配置文件
- 使用反射技术来加载类文件进内存
- 创建对象
- 执行方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义