Java动态代理

本文最后更新于:39 分钟前

Java动态代理

Java动态代理是Java的核心特性之一,它允许开发者在运行时动态地创建和操作对象。动态代理主要被用于实现AOP(面向切面编程)以及设计模式如装饰器、门面等。

Java动态代理主要涉及以下三个关键类:

  1. java.lang.reflect.Proxy:这个类是Java动态代理的入口,它提供了一些方法用于创建动态代理实例。
  2. java.lang.reflect.InvocationHandler:这个接口定义了一个方法,即invoke,该方法用于处理对动态代理实例的方法调用。
  3. java.lang.reflect.Proxy.newProxyInstance:这个方法用于创建动态代理实例。

Java动态代理的特点包括:

  • 动态代理可以在运行时动态地创建代理类和代理对象,无需手动编写代理类。
  • 动态代理可以代理任意接口的实现类,不需要为每一个被代理类都创建一个代理类,大大减少了代码量。
  • 动态代理的功能扩展不需要修改源代码,可以通过动态地添加、删除、修改代理对象来实现,符合开闭原则。
  • 动态代理可以在运行时动态地切换代理对象,非常灵活。

Java动态代理的缺陷包括:

  • 动态代理只能代理接口,无法代理普通类。
  • 动态代理在运行时通过反射机制动态生成代理类和代理对象,会增加系统的运行时开销。
  • 动态代理只能代理实现了接口的目标对象,无法代理没有实现接口的目标对象。
  • 当目标对象的方法比较多时,使用动态代理会导致代码量较大,不利于代码的维护。

示例

定义一个接口

1
2
3
public interface Animal {
void type();
}

实现该接口

1
2
3
4
5
6
7
public class Cat implements Animal {

@Override
public void type(){
System.out.println("Type is cat");
}
}

创建代理类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class AnimalDynamicProxyHandler implements InvocationHandler {

private final Object target;

public AnimalDynamicProxyHandler(Object target) {
this.target = target;
}


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

使用

1
2
3
4
5
6
7
8
9
public class Main {

public static void main(String[] args) throws Exception {
AnimalDynamicProxyHandler proxyHandler = new AnimalDynamicProxyHandler(new Cat());
Animal proxy = (Animal) Proxy.newProxyInstance(Animal.class.getClassLoader(), new Class[]{Animal.class}, proxyHandler);
proxy.type();
}

}

输出:

1
2
3
Before method call
Type is cat
After method call

Java动态代理
https://crudclass.github.io/2023/08/31/Java/Proxy/DynamicProxy/
作者
Zero
发布于
星期四, 八月 31日 2023, 10:20 上午
更新于
2023年8月31日
许可协议