如何理解java中的反射机制,为什么利用反射可以写开源框架?(1)
当诸君在使用idea或者eclipse/vscode等代码编辑器时,有没有想过当你在字符串后面或者一个类实例后输入.的时候
后面跟随出来的字符串方法以及类内方法调用是怎样给出提示的?
The answer is 反射.
反射的具体介绍
- 程序可以访问,检测和修改它本身状态或行为的能力,即自描述和自控制.
- 可以在运行时加载,探知和使用编译期间完全未知的类.
- 给Java插上动态语言特性的翅膀,弥补强类型语言的不足.
- java.lang.reflect包,在Java2时代就有,在Java5得到改善.
反射存在的意义
- 在运行中分析类的能力
- 在运行中查看和操作对象
- 基于反射自由创建对象
- 反射构建出无法直接访问的类
- set或者get到无法访问的成员变量
- 调用不可访问的方法
3.实现通用的数组操作代码
4.类似函数指针的功能
首先,创建一个对象有4种方法:
1. new出来
2. clone一个 (类实现Cloneable以备克隆)
3. 序列化读取对象 readObject
4. 反射 newInstance
反射还可以调用到类中的成员变量和成员方法
get方法中含有Declared的一般是调用类本身内的以及私有的(变量,方法)
在SomeClassC中,这个序列化可以很明白的理解序列化的意义了,不过序列化要在将来的JDK版本被移除.
这个类没有什么特殊性,就是一个clone,clone一个对象,两个对象一样,但是内存地址不同.类似复制一个桌面文件,文件内容一样,但是文件名(内存地址)不能重复放到一个磁盘.
最有趣的是调用方法,这里可以看到调用本类的f1方法进行输出打印,调用了String类里面的hashCode以及toString方法进行字符串的hashCode计算以及字符串的toString输出.
github
https://github.com/deadzq/reflect-demo
package com.example.annotationdemo; import com.example.annotationdemo.annotation.MultipleTest; import java.lang.reflect.Method; public class MultipleMain { public static void main(String[] args) throws Exception{ int passed = 0, failed = 0; String className = "com.example.annotationdemo.MultipleDemo"; for(Method m:Class.forName(className).getMethods()){ if(m.isAnnotationPresent(MultipleTest.class)){ System.out.println(m.getName()); MultipleTest st = m.getAnnotation(MultipleTest.class); try { m.invoke(null,st.a(),st.b()); passed++; } catch (Throwable e) { System.out.printf("Test %s failed: %s %n",m,e.getCause()); failed++; } } } System.out.printf("Passed: %d, Failed %d%n",passed,failed); } }
作者:ukyo--碳水化合物
出处:https://www.cnblogs.com/ukzq/p/12515319.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
2019-03-18 接口调用的跨域问题
2018-03-18 SeaCla