你对反射的了解

总结

Java反射是程序在运行时检查、修改自身结构和行为的能力。通过获取类型信息可动态创建对象、调用方法或访问属性,常用于框架开发与序列化等场景。

详细解析

Java反射(Reflection)是Java语言提供的一种动态机制,允许程序在运行时获取类的信息、操作类的属性和方法,甚至调用私有成员。这种能力使得Java代码可以突破编译时的限制,实现高度灵活的动态编程。


一、反射的核心概念

  1. 核心类

    • Class<T>:表示一个类或接口,是反射的入口。
    • Constructor<T>:表示类的构造方法。
    • Method:表示类的方法。
    • Field:表示类的成员变量。

二、反射的使用步骤

1. 获取Class对象

反射的起点是获取类的Class对象,常见方式:

1

2

3

4

5

6

7

8

9

// 方式1:通过类名.class

Class<?> clazz1 = String.class;

// 方式2:通过对象.getClass()

String str = "Hello";

Class<?> clazz2 = str.getClass();

// 方式3:通过Class.forName("全限定类名")

Class<?> clazz3 = Class.forName("java.lang.String");

2. 创建对象实例

通过Constructor创建实例,可调用私有构造方法:

1

2

3

4

5

6

7

8

9

Class<?> clazz = User.class;

// 获取无参构造方法

Constructor<?> constructor = clazz.getDeclaredConstructor();

constructor.setAccessible(true); // 解除私有限制

Object user = constructor.newInstance();

// 获取带参构造方法

Constructor<?> paramConstructor = clazz.getDeclaredConstructor(String.classint.class);

Object user2 = paramConstructor.newInstance("Alice"25);

3. 调用方法

动态调用方法(包括私有方法):

1

2

3

Method method = clazz.getDeclaredMethod("setName", String.class);

method.setAccessible(true); // 解除私有限制

method.invoke(user, "Bob"); // 调用方法

4. 访问字段

读写字段值(包括私有字段):

1

2

3

4

Field field = clazz.getDeclaredField("age");

field.setAccessible(true);

field.set(user, 30); // 设置值

int age = (int) field.get(user); // 获取值


三、反射的应用场景举例

  1. 框架开发

    • Spring:通过反射创建Bean、依赖注入。
    • Hibernate/MyBatis:动态映射数据库字段到Java对象。
    • JUnit:通过反射执行测试方法。
  2. 动态代理
    JDK动态代理(Proxy)基于反射生成代理对象,实现AOP。

  3. 注解处理
    结合反射解析自定义注解(如@RequestMapping)。

  4. 泛型擦除后操作
    通过反射获取泛型实际类型(如List<String>中的String)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值