Java SE 提供了 **反射、枚举和 Lambda 表达式** 这三种强大的特性,它们在不同场景下发挥着重要作用:
1. 反射(Reflection)**
反射机制允许程序在运行时动态获取类的信息,并操作其属性和方法。它是 Java 语言的元编程能力之一,常用于框架开发(如 Spring)。
#### **反射的核心类**
- `Class`:表示类的运行时信息。
- `Field`:表示类的成员变量。
- `Method`:表示类的方法。
- `Constructor`:表示类的构造方法。
获取 Class 对象的三种方式**
```java
// 方式 1:使用 Class.forName()
Class<?> clazz1 = Class.forName("com.example.MyClass");
// 方式 2:使用 .class
Class<?> clazz2 = MyClass.class;
// 方式 3:使用 getClass()
MyClass obj = new MyClass();
Class<?> clazz3 = obj.getClass();
```
反射调用方法**
```java
Method method = clazz1.getDeclaredMethod("myMethod", String.class);
method.setAccessible(true); // 允许访问私有方法
method.invoke(obj, "参数值");
```
2. 枚举(Enum)**
枚举用于定义一组固定的常量,避免使用魔法值,提高代码可读性和安全性。
#### **枚举的定义**
```java
public enum Status {
SUCCESS, FAILURE, PENDING;
}
```
枚举的使用**
```java
Status status = Status.SUCCESS;
System.out.println(status.name()); // 输出: SUCCESS
System.out.println(status.ordinal()); // 输出: 0
```
枚举的构造方法**
```java
public enum OrderStatus {
NEW("新订单"), SHIPPED("已发货"), DELIVERED("已送达");
private final String description;
OrderStatus(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
```
3. Lambda 表达式**
Lambda 表达式是 Java 8 引入的特性,简化了匿名类的写法,使代码更加简洁。
#### **Lambda 表达式语法**
```java
// 传统写法
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("Hello, Lambda!");
}
};
// Lambda 写法
Runnable r2 = () -> System.out.println("Hello, Lambda!");
```
#### **Lambda 与函数式接口**
```java
@FunctionalInterface
interface MathOperation {
int operate(int a, int b);
}
// 使用 Lambda 实现接口
MathOperation addition = (a, b) -> a + b;
System.out.println(addition.operate(5, 3)); // 输出: 8
```
| 特性 | 作用 | 适用场景 |
|------|------|---------|
| **反射** | 运行时动态操作类 | 框架开发、动态代理 |
| **枚举** | 定义固定常量 | 状态管理、配置项 |
| **Lambda** | 简化匿名类 | 函数式编程、流处理 |