Java代码解释静态代理和动态代理的区别

简介: ### 静态代理与动态代理简介**静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。**动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。

静态代理

在静态代理中,代理类是固定的,在编译时就已经确定了。

目标对象接口(TargetInterface)

public interface TargetInterface {
   
    void request();
}

目标对象实现类(TargetClass)

public class TargetClass implements TargetInterface {
   
    @Override
    public void request() {
   
        System.out.println("目标操作");
    }
}

代理对象接口(ProxyInterface)与代理对象实现类(ProxyClass)

public interface ProxyInterface extends TargetInterface {
   
    // 代理对象包含对目标对象的引用
    private TargetInterface target;

    public ProxyInterface(TargetInterface target) {
   
        this.target = target;
    }

    @Override
    public void request() {
   
        System.out.println("前置操作");
        target.request();
        System.out.println("后置操作");
    }
}

测试类(Test)

public class Test {
   
    public static void main(String[] args) {
   
        // 创建目标对象实例
        TargetInterface target = new TargetClass();
        // 创建代理对象实例
        ProxyInterface proxy = new ProxyClass(target);
        // 通过代理对象执行请求操作
        proxy.request();
    }
}

动态代理

动态代理使用Java的反射机制来创建代理类,可以在运行时生成。

目标对象接口(TargetInterface)

public interface TargetInterface {
   
    void request();
}

实现目标接口的目标对象实现类(TargetClass)

public class TargetClass implements TargetInterface {
   
    @Override
    public void request() {
   
        System.out.println("目标操作");
    }
}

使用动态代理创建代理对象

使用Java的Proxy类来创建动态代理:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxyTest {
   
    public static void main(String[] args) {
   
        // 创建目标对象实例
        TargetInterface target = new TargetClass();

        // 定义InvocationHandler实现类
        InvocationHandler handler = new InvocationHandler() {
   
            @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类创建代理对象
        TargetInterface proxyInstance = (TargetInterface) Proxy.newProxyInstance(
                TargetClass.class.getClassLoader(),
                new Class[]{
   TargetInterface.class},
                handler
        );

        // 通过代理对象执行请求操作
        proxyInstance.request();
    }
}

总结

  • 静态代理:在编译时就已经确定了代理类,较为固定。适用于功能简单的场景。
  • 动态代理:利用Java的反射机制可以在运行时生成代理类,更加灵活和通用。

通过上述代码示例可以看到,静态代理需要手动创建代理对象并定义好方法;而动态代理则不需要提前知道接口的具体实现细节,只需编写InvocationHandler逻辑即可。

相关文章
|
3月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
401 5
|
3月前
|
Java 数据处理 API
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
290 115
|
3月前
|
安全 Java 编译器
为什么你的Java代码需要泛型?类型安全的艺术
为什么你的Java代码需要泛型?类型安全的艺术
203 98
|
3月前
|
Java 编译器 API
java最新版和java8的区别,用代码展示
java最新版和java8的区别,用代码展示
345 43
|
3月前
|
安全 Java 容器
告别空指针噩梦:Optional让Java代码更优雅
告别空指针噩梦:Optional让Java代码更优雅
419 94
|
3月前
|
安全 Java 容器
告别繁琐判空:Optional让你的Java代码更优雅
告别繁琐判空:Optional让你的Java代码更优雅
|
4月前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
576 3
|
4月前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
531 3
|
4月前
|
Java
java入门代码示例
本文介绍Java入门基础,包含Hello World、变量类型、条件判断、循环及方法定义等核心语法示例,帮助初学者快速掌握Java编程基本结构与逻辑。
458 0