代理模式和java动态代理的机制(一)InvocationHandler
时间: 2024-01-02 21:52:16 浏览: 135
代理模式是一种常见的设计模式,它通过创建一个代理对象来控制对实际对象的访问,从而实现对实际对象的间接访问。Java动态代理机制就是一种基于代理模式的实现方式,可以在运行时动态地生成代理类。
Java动态代理机制是通过反射实现的,它主要涉及到两个类:`Proxy`和`InvocationHandler`。`Proxy`类是用来创建代理对象的类,`InvocationHandler`则是代理对象的调用处理器,用来处理代理对象的方法调用。
`InvocationHandler`接口中有一个`invoke()`方法,当代理对象的方法被调用时,`invoke()`方法会被自动调用,并将方法名、参数等信息传递给该方法。在`invoke()`方法中,我们可以对代理对象的方法进行增强处理,也可以选择调用实际对象的方法。
下面是一个简单的示例,演示了如何使用`InvocationHandler`实现动态代理:
```java
public class DynamicProxyDemo {
public static void main(String[] args) {
// 创建实际对象
RealObject realObject = new RealObject();
// 创建代理对象
MyInvocationHandler handler = new MyInvocationHandler(realObject);
Interface proxy = (Interface) Proxy.newProxyInstance(
Interface.class.getClassLoader(),
new Class[]{Interface.class},
handler);
// 调用代理对象的方法
proxy.doSomething();
}
}
// 实际对象
class RealObject implements Interface {
public void doSomething() {
System.out.println("Do something...");
}
}
// 调用处理器
class MyInvocationHandler implements InvocationHandler {
private Object realObject;
public MyInvocationHandler(Object realObject) {
this.realObject = realObject;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before invoke...");
Object result = method.invoke(realObject, args);
System.out.println("After invoke...");
return result;
}
}
// 接口
interface Interface {
void doSomething();
}
```
在这个示例中,我们首先创建了一个`RealObject`实际对象,然后创建了一个`MyInvocationHandler`调用处理器,并将实际对象传递给它。接着,我们使用`Proxy.newProxyInstance()`方法创建了一个代理对象,并将调用处理器绑定到代理对象上。最后,我们调用代理对象的`doSomething()`方法,实际上是调用了`MyInvocationHandler`中的`invoke()`方法,在该方法中对实际对象的方法进行了增强处理。
在实际开发中,我们常常会使用Java动态代理机制来实现AOP(面向切面编程)等功能,通过在代理对象的调用处理器中添加相应的增强代码来实现对目标对象的增强处理。
阅读全文