Java动态代理深入解析
需积分: 12 101 浏览量
更新于2024-07-18
收藏 96KB DOCX 举报
"动态代理由浅入深"
动态代理是一种在Java编程中实现的一种设计模式,它允许我们在不修改原始类代码的情况下,对类的方法进行增强或扩展。这种模式的核心思想是通过代理对象来调用目标对象的方法,同时在调用前后添加额外的操作。动态代理的关键在于它的“动态”特性,即代理类是在运行时由Java虚拟机(JVM)动态生成的,而不是在编译时静态创建。
代理模式通常用于实现事务管理、权限控制、日志记录等功能,这些功能往往需要在方法调用前后进行,而动态代理则提供了一种灵活的方式去实现这些需求。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。
首先,我们需要定义一个接口,这个接口代表了我们要代理的行为。例如,在上述例子中,有一个`Milk`接口,它有两个方法:`sell`和`make`,分别表示卖奶茶和制造奶茶。
```java
public interface Milk {
public void sell(String milkName);
public void make();
}
```
然后,我们创建一个实现了`Milk`接口的类,比如`YiDianDian`,表示奶茶品牌“一点点”。
```java
public class YiDianDian implements Milk {
@Override
public void sell(String milkName) {
System.out.println("卖奶茶");
}
@Override
public void make() {
System.out.println("制造奶茶");
}
}
```
接下来,我们需要实现`InvocationHandler`接口,这个接口的`invoke`方法会在代理对象的方法被调用时被触发。在这个方法中,我们可以添加额外的操作,如添加品牌名称。
```java
public class DynamicProxy implements InvocationHandler {
private Object target;
public DynamicProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在调用目标方法前添加操作
System.out.println("添加品牌名:一点点");
// 调用目标方法
Object result = method.invoke(target, args);
// 在调用目标方法后添加操作
System.out.println("完成交易");
return result;
}
}
```
最后,我们可以通过`Proxy.newProxyInstance()`方法创建动态代理对象,并将之前创建的品牌商对象和`InvocationHandler`对象传入。然后就可以通过代理对象调用方法,而实际执行的是`InvocationHandler`中的`invoke`方法。
```java
public class Test {
public static void main(String[] args) {
Milk milk = new YiDianDian();
Milk proxyMilk = (Milk) Proxy.newProxyInstance(
Milk.class.getClassLoader(),
new Class[]{Milk.class},
new DynamicProxy(milk)
);
proxyMilk.sell("珍珠奶茶");
proxyMilk.make();
}
}
```
在上述代码中,当调用`proxyMilk.sell()`和`proxyMilk.make()`时,实际上会执行`DynamicProxy`中的`invoke`方法,从而在调用前后添加了品牌名和交易完成的操作。这就是动态代理的基本原理和实现方式。
总结起来,动态代理在Java中是一种强大的工具,它可以帮助我们实现对原有类方法的扩展,而无需修改原有代码,增强了代码的可维护性和灵活性。通过`InvocationHandler`,我们可以实现各种自定义的增强逻辑,满足不同的业务需求。
2019-06-01 上传
2013-11-15 上传
2013-09-05 上传
2009-07-21 上传
2019-08-10 上传
2012-11-16 上传
2022-04-26 上传