Skip to content

已阅读

0%

Java动态代理

Java Proxy

Java动态代理

标签:
Java
发布于 2023年8月31日
更新于 2023年8月31日

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

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

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

Java动态代理的特点包括:

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

Java动态代理的缺陷包括:

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

示例

定义一个接口

java
public interface Animal {
    void type();
}

实现该接口

java
public class Cat implements Animal {

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

创建代理类

java
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;
    }

使用

java
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(); 
    }

}

输出:

text
Before method call
Type is cat
After method call

Last updated: