广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java深入浅出讲解代理模式
  • 783
分享到

Java深入浅出讲解代理模式

2024-04-02 19:04:59 783人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录1、动态代理模式2、jdk动态代理3、JDK动态代理代码演示1、动态代理模式 动态代理的特点: 当代理对象的时候,不需要实现接口代理对象的生成,是利用JDK的api,动态的在内存

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;


    
    @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();

        
        Moveable m = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(),
                cls.getInterfaces(),h);
        m.move();
    }
}

这样的输出结果是:

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

注意:

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

在这里插入图片描述

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

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

三月份完美收官!最后小应学长十分感谢大家的支持的陪伴,你们在支持是我最大的动力,继续写出大家喜欢的文章!

到此这篇关于Java 深入浅出讲解代理模式的文章就介绍到这了,更多相关Java 代理模式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java深入浅出讲解代理模式

本文链接: https://www.lsjlt.com/news/144669.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java深入浅出讲解代理模式
    目录1、动态代理模式2、JDK动态代理3、JDK动态代理代码演示1、动态代理模式 动态代理的特点: 当代理对象的时候,不需要实现接口代理对象的生成,是利用JDK的API,动态的在内存...
    99+
    2022-11-13
  • 深入浅出讲解Java8函数式编程
    目录什么是函数式编程Java8内置了一些常用的方法接口FunctionalInterface用的比较多的函数接口总结什么是函数式编程 函数式编程就是一种抽象程度很高的编程范式,纯粹的...
    99+
    2022-11-13
  • 深入浅出讲解Java中的枚举类
    目录一、枚举类的使用 二、如何定义枚举类 背景:类的对象只有有限个,确定的。举例如下: > 星期: Monday (星期一)、….、 Sunday (星期天) > 性别:...
    99+
    2022-11-12
  • 深入浅析java设计模式中的代理模式
    这期内容当中小编将会给大家带来有关深入浅析java设计模式中的代理模式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、什么是代理模式(Porxy)  概念:代理模式就是为其他对象提供一种代理以控制对这个...
    99+
    2023-05-31
    java ava 代理模式
  • Java深入浅出讲解泛型与包装类
    目录1、什么是泛型2、泛型的语法3、泛型的上界4、通配符(1)通配符的上界(2)通配符的下界5、包装类1、什么是泛型 泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指...
    99+
    2022-11-13
  • 深入浅出讲解Java集合之Map接口
    目录一、Map接口继承树二、Map接口中的常用方法三、源码分析1.HashMap的底层实现原理?2.LinkedHashMap的底层实现原理(了解)四、Collections工具类一...
    99+
    2022-11-12
  • 深入浅出讲解Java集合之Collection接口
    目录一、集合框架的概述二、集合框架(Java集合可分为Collection 和 Map 两种体系)三、Collection接口中的方法的使用四、集合元素的遍历操作A. 使用(迭代器)...
    99+
    2022-11-12
  • Java深入浅出讲解String类常见方法
    目录1.定义字符串2.字符串的存储3.String中常用的方法3.1字符串的比较3.2查找字符串3.3转换字符串4.StringBuilder和StringBuffer5.常量池1....
    99+
    2022-11-13
  • Java代理模式的深入了解
    目录一、静态代理模式1.1、 代理模式的定义:1.2、代理模式的优缺点二、动态代理模式总结一、静态代理模式 1.1、 代理模式的定义: 由于某些原因需要给某对象提供一个代理以控制对该...
    99+
    2022-11-12
  • 深入浅出解析Java ThreadLocal原理
    目录1.了解ThreadLocal简介使用2.源码解析 – 探究实现思路threadLocals变量与ThreadLocalMapset(T value) 方法get() 方法rem...
    99+
    2022-11-12
  • 深入理解Java设计模式之代理模式
    目录一、引言二、什么是代理模式三、代理模式的结构四、代理模式和装饰模式的异同五、代理模式和委托六、代理模式的种类七、代理模式的应用场景八、代理模式的优缺点九、代理模式的实现总结一、引...
    99+
    2022-11-12
  • 【深入浅出设计模式--状态模式】
    深入浅出设计模式--状态模式 一、背景二、问题三、解决方案四、 适用场景总结五、后记 一、背景 状态模式是一种行为设计模式,让你能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。其与有限状态机的概念紧...
    99+
    2023-08-30
    c++ 设计模式 状态模式 单例模式
  • 深入浅出讲解Angular变更检测
    Angular 中的变更检测是一种用来将应用程序 UI 的状态与数据的状态同步的机制。当应用逻辑更改组件数据时,绑定到视图中 DOM 属性上的值也要随之更改。变更检测器负责更新视图以...
    99+
    2022-11-13
  • C++深入浅出讲解缺省参数
    目录缺省参数定义用法缺省参数 一般情况下,函数调用时的实参个数应与形参相同,但为了更方便地使用函数,C++也允许定义具有缺省参数的函数,这种函数调用时,实参个数可以与形参不相同。 定...
    99+
    2022-11-13
  • C++深入浅出讲解函数重载
    目录前言函数重载1.1 函数重载的概念1.2 函数重载的意义1.3 名字修饰(name Mangling)1.4 extern "C"前言 自然语言中,一个词可以...
    99+
    2022-11-13
  • Java设计模式系列之深入浅出单例模式
    目录前言饿汉式懒汉式线程安全问题volatile的作用总结前言 我不知道大家工作或者面试时候遇到过单例模式没,面试的话我记得我当时在17年第一次实习的时候,就遇到了单例模式,面试官是...
    99+
    2022-11-12
  • Java设计模式之单件模式深入讲解
    目录定义Java单件模式经典单件模式的实现多线程单件模式的实现急切创建实例双重检查加锁Python单件模式模块实现new关键字实现装饰器实现函数装饰器类装饰器定义 单件模式确保一个类...
    99+
    2022-11-12
  • Java由浅入深讲解继承下
    目录1.代码块初始化2.protected关键字3.final关键字4.Java中允许的继承方式本篇紧接上一篇内容继续,还是从继承里的细节开始 1.代码块初始化 关于代码块的定义和使...
    99+
    2022-11-13
  • Java由浅入深讲解继承上
    目录1.什么是继承2.继承的细节2.1super关键字2.2子类的构造方法2.3super和this区别继承同样是面向对象程序的特点 1.什么是继承 所谓继承就是抽取类的共性,进而实...
    99+
    2022-11-13
  • 深入浅出讲解MySQL的并行复制
    一、并行复制的背景 首先,为什么会有并行复制这个概念呢? 1. DBA都应该知道,MySQL的复制是基于binlog的。  2. MySQL复制包括两部分,IO线程 和 SQL线程。 ...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作