Java反射
1. 反射入门
1.1 反射 :reflection
-
程序可以访问、检测和修改它自身状态或行为的能力,即自描述和自控制
-
实现在运行时加载、探知和使用编译期间完全未知的类
- 基于反射自由创建对象
- 反射构建出无法直接访问的类
- set或者get到无法访问的成员变量
- 调用不可访问的方法
-
实现通用的数组操作代码
-
实现类似函数指针的功能
1.2 创建对象的方法
-
静态编码&编译
直接new调用构造函数
-
克隆(clone)
没有调用构造函数
-
序列化(serialization)和反序列化(deserialization)
-
反射
1. newInstance 调用构造函数 A obj = (A)Class.forName("A").newInstance(); 2. newInstance 调用构造函数 Constructor<A> constructor = A.class.getContructor() ; A obj = constructor.newInstance();
2. 反射关键类
2.1 Class:类型标识
-
JVM为每个对象都保留其类型标识信息(Runtime Type Identification)
-
三种获取方式
- 对象实例.getClass()
- Class.forName(""),例如Class.forName("java.lang.String")
- Class.Class,例如String.class
-
成员变量、方法、构造函数、修饰符、包、父类、父接口
- Filed(getFilelds()、getDeclareFields())
- Package(getPackage())
- 接口Class(getInterfaces())
- Constructor(getConstructors())
- Method(getMethods()、getDeclareMethods())
- 修饰符(getModifiers())
- 父类Class(getSuperClass())
- Annotation(getAnnotation())
3. 反射应用
- 数据库连接
- 数组扩充器
- 动态执行方法
- Json和Java对象互转
- Tomcat的Servlet对象创建
- MyBatis的OR/M
- Spring的Bean容器
4. 编译器API
4.1 反射
- 可以查看对象的类型标识
- 可以动态创建对象、访问其属性、调用其方法
- 前提:类(class文件)必须先存在
4.2 编译器API
- 对.java文件即时编译
- 对字符串即时编译
- 监听在编译过程中产生的警告和错误
- 在代码中运行编译器(并非Runtime命令行调用javac命令)
4.3 JavaCompiler
- 自Java1.6推出,位于javax.tools包中
- 可用在程序文件中的Java编译器接口(代替javac.exe)
- 在程序中编译java文件,产生class文件
- run方法(继承自java.tools.Tools):较简单。可以编译java源文件,生成class文件,但不能指定输出路径,监控错误信息,调用后就在源码所在目录生成class文件
- getTask方法:更强大的功能。可以编译java源文件,包括在内存中的java文件(字符串),生成class文件
4.4 Java编译器API作用
- Java EE的JSP编译
- 在线编程环境
- 在线程序评判系统(Online Judge系统)
- 自动化的构建和测试工具
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现