InvocationHandler是什么
`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`方法中的逻辑。