千家信息网

Java代理模式实例代码分析

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,今天小编给大家分享一下Java代理模式实例代码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来
千家信息网最后更新 2026年11月04日Java代理模式实例代码分析

今天小编给大家分享一下Java代理模式实例代码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1、动态代理模式

动态代理的特点:

  • 当代理对象的时候,不需要实现接口

  • 代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)

动态代理的别称:JDK代理、接口代理

2、JDK动态代理

类图:

Java动态代理类位于java.lang.reflect包下

一般主要涉及到以下两个类:

1、Interface InvocationHandler : 该接口中仅定义了一个方法public object invoke(Object obj,Method method, Object[] args) 在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组。这个抽象方法在代理类中动态实现。

2、Proxy:该类即为动态代理类

static Object newProxyInstance(ClassLoader loader, Class[] interfaces,InvocationHandler h):

返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在接口中声明过的方法)

动态代的实现步骤:

  • 创建一个实现接口InvocationHandler的类,它必须实现invoke方法

  • 创建被代理的类以及接口

  • 调用Proxy的静态方法,创建一个代理类:newProxyInstance(ClassLoader loader,Class[]

  • 通过代理调用方法

3、JDK动态代理代码演示

比如现在有一个汽车驾驶的方法:

public interface Moveable {    void move();}

现在有一辆汽车:

//实现Moveable 接口,并随机暂停一段时间import java.util.Random;public class Car implements Moveable{    @Override    public void move() {        try{            Thread.sleep(new Random().nextInt(1000));            System.out.println("汽车行驶中");        } catch (InterruptedException e) {            e.printStackTrace();        }    }}

时间代理类:

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class TimeHandler implements InvocationHandler{    public TimeHandler(Object target){        super();        this.target = target;    }    private Object target;    /**     *     * @param proxy :被代理的对象     * @param method:被代理对象的方法     * @param args:方法的参数     * @return     * @throws Throwable     * 返回值:Object 方法的返回值     */    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        long startTime = System.currentTimeMillis();        System.out.println("汽车开始行使");        method.invoke(target);        long endTime = System.currentTimeMillis();        System.out.println("汽车行驶结束,行驶的时间为:"+(endTime-startTime)+"毫秒");        return null;    }}

测试类:

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;public class Test {    public static void main(String[] args) {        Car car = new Car();        InvocationHandler h = new TimeHandler(car);        Class cls = car.getClass();        /**         * newProxyInstanced的参数         * 分别是:类加载器、实现的接口、实现的处理器         */        Moveable m = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(),                cls.getInterfaces(),h);        m.move();    }}

这样的输出结果是:

汽车开始行使
汽车行驶中
汽车行驶结束,行驶的时间为:137毫秒
//后面的时间是随机产生的,每次都不一样

注意:

JDK代理只能代理实现了接口的类,没有实现接口的不能代理

以上就是JDK动态代理,当然还有cglib动态代理:

cglib是针对类来实现代理的,cglib的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理,因为小应学长自己对这一块也没有完全掌握,这里就不多讲解,大家可以参考其他博主的技术文章。

以上就是"Java代理模式实例代码分析"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

代理 方法 动态 接口 汽车 对象 时间 参数 知识 篇文章 代码 实例 模式 分析 内容 就是 目标 参考 生成 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技园 互联网科技公司起名 深圳恒合互联网络科技有限公司 互联网金融监管科技数据 科技与互联网 金融科技还是互联网 广州宏创互联网科技 北京互联网络科技有限公司 善班互联网科技有限公司 互联网科技类展会 海南科技产业互联网平台 安控科技rtu产品工业互联网 天速互联网络科技有限公司 互联网为啥属于高科技 昭通互联网科技选哪家 洛阳昕诺飞互联网科技有限公司 明优互联网科技有限公司 恒生互联网科技业指数调整周期 互联网时代科技型公司的机会 互联网时代高科技布局 互联网科技有限公司图片 互联网科技股票 奇酷互联网络科技 丰台科技园 互联网 北京大学互联网科技怎么样 成都互联网科技公司工作好不好 河南住房之家互联网科技 众安科技工业互联网合作 互联网金融科技公司的优势 互联网金融运营模式中的金融科技
0