java中静态代理和动态代理 - 面试宝典

举报
皮牙子抓饭 发表于 2023/08/13 17:05:00 2023/08/13
【摘要】 静态代理和动态代理是Java中常用的两种代理模式。静态代理: 静态代理是通过手动编写代理类来实现的。在静态代理中,代理类和被代理类都实现同一个接口,代理类持有被代理类的实例,并在代理类中对被代理类的方法进行增强或添加额外的逻辑。在调用被代理类的方法之前或之后,代理类可以执行一些前置或后置操作。静态代理的优点是简单易懂,可以更加灵活地对被代理类进行控制和管理,但缺点是每个被代理类都需要一个代理...

静态代理和动态代理是Java中常用的两种代理模式。

  1. 静态代理: 静态代理是通过手动编写代理类来实现的。在静态代理中,代理类和被代理类都实现同一个接口,代理类持有被代理类的实例,并在代理类中对被代理类的方法进行增强或添加额外的逻辑。在调用被代理类的方法之前或之后,代理类可以执行一些前置或后置操作。静态代理的优点是简单易懂,可以更加灵活地对被代理类进行控制和管理,但缺点是每个被代理类都需要一个代理类,导致代码冗余。
  2. 动态代理: 动态代理是在运行时生成代理类的方式。通过使用Java的反射机制,在运行时动态地创建一个代理类,并将被代理类的实例传递给代理类。代理类在调用被代理类的方法时,可以在方法的前后进行增强或添加额外的逻辑。相比于静态代理,动态代理的优点是可以减少代码量,提高代码的复用性和可维护性,但缺点是相对复杂,需要了解反射机制。 总结: 静态代理和动态代理都是为了实现对被代理类的增强或添加额外的逻辑。静态代理需要手动编写代理类,而动态代理在运行时生成代理类。静态代理灵活但代码冗余,动态代理代码更简洁但相对复杂。在实际应用中,可以根据具体需求选择合适的代理方式。
  3. 静态代理示例代码:
javaCopy code// 定义接口
interface IService {
    void doSomething();
}
// 实现被代理类
class Service implements IService {
    @Override
    public void doSomething() {
        System.out.println("Doing something.");
    }
}
// 实现代理类
class ProxyService implements IService {
    private final IService service;
    public ProxyService(IService service) {
        this.service = service;
    }
    @Override
    public void doSomething() {
        System.out.println("Before doing something.");
        service.doSomething();
        System.out.println("After doing something.");
    }
}
// 使用代理类
public class Main {
    public static void main(String[] args) {
        IService service = new Service();
        IService proxy = new ProxyService(service);
        proxy.doSomething();
    }
}
  1. 动态代理示例代码:
javaCopy codeimport java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 定义接口
interface IService {
    void doSomething();
}
// 实现被代理类
class Service implements IService {
    @Override
    public void doSomething() {
        System.out.println("Doing something.");
    }
}
// 实现InvocationHandler接口
class DynamicProxyHandler implements InvocationHandler {
    private final Object target;
    public DynamicProxyHandler(Object target) {
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before doing something.");
        Object result = method.invoke(target, args);
        System.out.println("After doing something.");
        return result;
    }
}
// 使用动态代理
public class Main {
    public static void main(String[] args) {
        IService service = new Service();
        InvocationHandler handler = new DynamicProxyHandler(service);
        IService proxy = (IService) Proxy.newProxyInstance(
                service.getClass().getClassLoader(),
                service.getClass().getInterfaces(),
                handler);
        proxy.doSomething();
    }
}

以上示例中,静态代理通过创建代理类ProxyService来实现增强逻辑,并在调用被代理类Service的方法前后进行额外操作。动态代理通过创建动态代理处理器DynamicProxyHandler来实现增强逻辑,并在调用被代理类Service的方法前后进行额外操作。动态代理利用了Java的反射机制,通过Proxy.newProxyInstance()方法在运行时动态生成代理类。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。