InvocationHandler是什么

zqlmianshi / 2024-09-23 / 原文

`InvocationHandler`是Java中的一个接口,用于处理通过代理对象的方法调用。它主要应用于动态代理机制,允许在运行时动态地创建代理类和其实例。`InvocationHandler`的主要作用包括:

1. **拦截方法调用**:当代理对象的方法被调用时,`InvocationHandler`的`invoke`方法会被触发。这使得你可以在方法调用前后添加自定义逻辑,例如日志记录、权限检查、事务管理等。

2. **动态代理**:通过使用`Proxy`类和`InvocationHandler`接口,可以在运行时创建实现一个或多个接口的代理实例,而不需要预先定义这些代理类。这种机制非常灵活,适用于如AOP(面向切面编程)等场景。

3. **解耦和灵活性**:使用动态代理可以使代码更加解耦,减少硬编码,同时提高系统的灵活性和可维护性。

以下是一个简单的示例,展示了如何使用`InvocationHandler`来创建一个动态代理:

```java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 定义一个接口
interface MyInterface {
void myMethod();
}

// 实现接口的真实类
class RealClass implements MyInterface {
@Override
public void myMethod() {
System.out.println("RealClass: myMethod()");
}
}

// 创建InvocationHandler实现类
class MyInvocationHandler implements InvocationHandler {
private Object realObject;

public MyInvocationHandler(Object realObject) {
this.realObject = realObject;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method call");
Object result = method.invoke(realObject, args);
System.out.println("After method call");
return result;
}
}

public class Main {
public static void main(String[] args) {
// 创建真实对象
MyInterface realObject = new RealClass();

// 创建代理对象
MyInterface proxyInstance = (MyInterface) Proxy.newProxyInstance(
realObject.getClass().getClassLoader(),
realObject.getClass().getInterfaces(),
new MyInvocationHandler(realObject)
);

// 调用代理对象的方法
proxyInstance.myMethod();
}
}
```

在这个示例中,`MyInvocationHandler`实现了`InvocationHandler`接口,并在`invoke`方法中添加了方法调用前后的日志打印。通过`Proxy.newProxyInstance`方法创建了一个代理对象,当调用代理对象的`myMethod`方法时,会首先执行`invoke`方法中的逻辑。