Java SE 提供了 **反射、枚舉和 Lambda 表達式** 這三種強大的特性,它們在不同場景下發(fā)揮著重要作用:
1. 反射(Reflection)**
反射機制允許程序在運行時動態(tài)獲取類的信息,并操作其屬性和方法。它是 Java 語言的元編程能力之一,常用于框架開發(fā)(如 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();
```
反射調(diào)用方法**
```java
Method method = clazz1.getDeclaredMethod("myMethod", String.class);
method.setAccessible(true); // 允許訪問私有方法
method.invoke(obj, "參數(shù)值");
```
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("已發(fā)貨"), DELIVERED("已送達");
private final String description;
OrderStatus(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
```
3. Lambda 表達式**
Lambda 表達式是 Java 8 引入的特性,簡化了匿名類的寫法,使代碼更加簡潔。
#### **Lambda 表達式語法**
```java
// 傳統(tǒng)寫法
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("Hello, Lambda!");
}
};
// Lambda 寫法
Runnable r2 = () -> System.out.println("Hello, Lambda!");
```
#### **Lambda 與函數(shù)式接口**
```java
@FunctionalInterface
interface MathOperation {
int operate(int a, int b);
}
// 使用 Lambda 實現(xiàn)接口
MathOperation addition = (a, b) -> a + b;
System.out.println(addition.operate(5, 3)); // 輸出: 8
```
| 特性 | 作用 | 適用場景 |
|------|------|---------|
| **反射** | 運行時動態(tài)操作類 | 框架開發(fā)、動態(tài)代理 |
| **枚舉** | 定義固定常量 | 狀態(tài)管理、配置項 |
| **Lambda** | 簡化匿名類 | 函數(shù)式編程、流處理 |