java 反射(reflection)是一种强大的机制,允许程序在运行时检查或修改其自身结构和行为。通过反射,可以在运行时查看类的属性、方法、构造函数等信息,并能动态调用这些方法和构造函数。这对于开发一些需要灵活处理对象和类的高级框架和库非常有用。
一、什么是反射?
java 反射(reflection)是指程序在运行期间动态获取类的信息,并操作类中的属性、方法和构造方法。
简单来说,正常情况下我们这样创建对象:
user user = new user();
而使用反射,可以根据类名动态创建对象:
class<?> clazz = class.forname("com.example.user");
object obj = clazz.getdeclaredconstructor().newinstance();
spring、mybatis 等框架中都大量使用了反射机制。
二、获取 class 对象
常见有三种方式:
// 1. 通过.class
class<user> clazz1 = user.class;
// 2. 通过对象
user user = new user();
class<?> clazz2 = user.getclass();
// 3. 通过类的全限定名
class<?> clazz3 = class.forname("com.example.user");其中 class.forname() 比较适合动态加载类。
三、通过反射创建对象
假设有一个 user 类:
public class user {
private string name;
public user() {
}
public void sayhello() {
system.out.println("hello java");
}
}通过反射创建对象:
class<user> clazz = user.class;
user user = clazz
.getdeclaredconstructor()
.newinstance();四、通过反射操作属性
获取属性:
field field = clazz.getdeclaredfield("name");
如果属性是 private,可以设置:
field.setaccessible(true);
然后修改属性:
field.set(user, "张三");
读取属性:
object value = field.get(user); system.out.println(value);
五、通过反射调用方法
获取方法:
method method = clazz.getdeclaredmethod("sayhello");
调用方法:
method.invoke(user);
如果是私有方法:
method.setaccessible(true); method.invoke(user);
六、常用 api
| api | 作用 |
|---|---|
getdeclaredconstructor() | 获取构造方法 |
getdeclaredfield() | 获取属性 |
getdeclaredfields() | 获取所有属性 |
getdeclaredmethod() | 获取方法 |
getdeclaredmethods() | 获取所有方法 |
newinstance() | 创建对象 |
invoke() | 调用方法 |
set() | 修改属性 |
七、反射的应用场景
java 反射常见于:
- spring ioc 创建 bean
- spring mvc 调用 controller 方法
- mybatis 封装查询结果
- junit 执行测试方法
- 读取注解
- 动态加载类
八、反射的优缺点
优点
- 灵活性高
- 可以动态加载类
- 降低代码之间的硬编码依赖
- 适合框架开发
缺点
- 性能比直接调用略低
- 可能破坏封装性
- 部分错误只能在运行时发现
- 代码可读性相对较差
总结
java 反射的核心就是:
在运行期间动态获取类的信息,并创建对象、修改属性、调用方法。
重点记住四个类即可:
class constructor field method
基本流程:
获取 class ↓ 创建对象 ↓ 获取属性 / 方法 ↓ 修改属性 / 调用方法
掌握这些基本操作后,就能更容易理解 spring、mybatis 等框架的部分底层原理。
到此这篇关于一篇文章彻底搞懂 java 反射(实例详解)的文章就介绍到这了,更多相关java反射内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论