iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >JAVA中静态代理与动态代理的区别有哪些
  • 103
分享到

JAVA中静态代理与动态代理的区别有哪些

java静态代理动态代理 2023-05-31 08:05:50 103人浏览 泡泡鱼
摘要

这期内容当中小编将会给大家带来有关JAVA中静态代理与动态代理的区别有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。代理模式是java中最常用的设计模式之一,尤其是在spring框架中广泛应用。对于j

这期内容当中小编将会给大家带来有关JAVA中静态代理与动态代理的区别有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

代理模式是java中最常用的设计模式之一,尤其是在spring框架中广泛应用。对于java的代理模式,一般可分为:静态代理、动态代理、以及CGLIB实现动态代理。

对于上述三种代理模式,分别进行说明。

1.静态代理

静态代理其实就是在程序运行之前,提前写好被代理方法的代理类,编译后运行。在程序运行之前,class已经存在。
下面我们实现一个静态代理demo:

JAVA中静态代理与动态代理的区别有哪些

静态代理

定义一个接口Target

package com.test.proxy;public interface Target {  public String execute();}

TargetImpl 实现接口Target

package com.test.proxy;public class TargetImpl implements Target {  @Override  public String execute() {    System.out.println("TargetImpl execute!");    return "execute";  }}

代理类

package com.test.proxy;public class Proxy implements Target{  private Target target;  public Proxy(Target target) {    this.target = target;  }  @Override  public String execute() {    System.out.println("perProcess");    String result = this.target.execute();    System.out.println("postProcess");    return result;  }}

测试类:

package com.test.proxy;public class ProxyTest {  public static void main(String[] args) {    Target target = new TargetImpl();    Proxy p = new Proxy(target);    String result = p.execute();    System.out.println(result);  }}

运行结果:

perProcessTargetImpl execute!postProcessexecute

静态代理需要针对被代理的方法提前写好代理类,如果被代理的方法非常多则需要编写很多代码,因此,对于上述缺点,通过动态代理的方式进行了弥补。

2.动态代理

动态代理主要是通过反射机制,在运行时动态生成所需代理的class.

JAVA中静态代理与动态代理的区别有哪些

动态代理

接口

package com.test.dynamic;public interface Target {  public String execute();}

实现类

package com.test.dynamic;public class TargetImpl implements Target {  @Override  public String execute() {    System.out.println("TargetImpl execute!");    return "execute";  }}

代理类

package com.test.dynamic;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class DynamicProxyHandler implements InvocationHandler{  private Target target;  public DynamicProxyHandler(Target target) {    this.target = target;  }  @Override  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {    System.out.println("========before==========");    Object result = method.invoke(target,args);    System.out.println("========after===========");    return result;  }}

测试类

package com.test.dynamic;import java.lang.reflect.Proxy;public class DynamicProxyTest {  public static void main(String[] args) {    Target target = new TargetImpl();    DynamicProxyHandler handler = new DynamicProxyHandler(target);    Target proxySubject = (Target) Proxy.newProxyInstance(TargetImpl.class.getClassLoader(),TargetImpl.class.getInterfaces(),handler);    String result = proxySubject.execute();    System.out.println(result);  }}

运行结果:

========before==========TargetImpl execute!========after===========execute

无论是动态代理还是静态带领,都需要定义接口,然后才能实现代理功能。这同样存在局限性,因此,为了解决这个问题,出现了第三种代理方式:cglib代理。

3.cglib代理

CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。jdk动态代理与CGLib动态代理均是实现Spring aop的基础。

JAVA中静态代理与动态代理的区别有哪些

cglib动态代理

目标类

package com.test.cglib;public class Target {  public String execute() {    String message = "-----------test------------";    System.out.println(message);    return message;  }}

通用代理类:

package com.test.cglib;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class MyMethodInterceptor implements MethodInterceptor{  @Override  public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {    System.out.println(">>>>MethodInterceptor start...");    Object result = proxy.invokeSuper(obj,args);    System.out.println(">>>>MethodInterceptor ending...");    return "result";  }}

测试类

package com.test.cglib;import net.sf.cglib.proxy.Enhancer;public class CglibTest {  public static void main(String ... args) {    System.out.println("***************");    Target target = new Target();    CglibTest test = new CglibTest();    Target proxyTarget = (Target) test.createProxy(Target.class);    String res = proxyTarget.execute();    System.out.println(res);  }  public Object createProxy(Class targetClass) {    Enhancer enhancer = new Enhancer();    enhancer.setSuperclass(targetClass);    enhancer.setCallback(new MyMethodInterceptor());    return enhancer.create();  }}

执行结果:

***************>>>>MethodInterceptor start...-----------test------------>>>>MethodInterceptor ending...result

代理对象的生成过程由Enhancer类实现,大概步骤如下:

生成代理类Class的二进制字节码;

通过Class.forName加载二进制字节码,生成Class对象;

通过反射机制获取实例构造,并初始化代理类对象。

上述就是小编为大家分享的JAVA中静态代理与动态代理的区别有哪些了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: JAVA中静态代理与动态代理的区别有哪些

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

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

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

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

下载Word文档
猜你喜欢
  • JAVA中静态代理与动态代理的区别有哪些
    这期内容当中小编将会给大家带来有关JAVA中静态代理与动态代理的区别有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。代理模式是java中最常用的设计模式之一,尤其是在spring框架中广泛应用。对于j...
    99+
    2023-05-31
    java 静态代理 动态代理
  • Java JDK与cglib动态代理有哪些区别
    本篇内容主要讲解“Java JDK与cglib动态代理有哪些区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java JDK与cglib动态代理有哪些区别”吧!一、说明sp...
    99+
    2023-07-05
  • Java 静态代理与动态代理解析
    目录一、代码实践静态代理动态代理二、常见的动态代理场景Retrofit中的动态代理使用动态代理实现 onClick注入三、源码探索 Jdk 中的动态代理生成代理类四、总结静态代理: ...
    99+
    2022-11-13
  • java静态代理与动态代理的概念
    本篇内容介绍了“java静态代理与动态代理的概念”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!    ...
    99+
    2023-06-02
  • 动态代理IP和静态代理IP有什么区别
    动态代理IP和静态代理IP有什么区别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。代理ip从ip的拨号方式来区分,分为动态ip和静态ip,所以代理ip也分为动态ip和静态i...
    99+
    2023-06-15
  • 深入理解Java动态代理与静态代理
    目录前言一、静态代理静态代理的使用与装饰者模式的区别二、动态代理JDK 动态代理CGlib 动态代理实现前言 学习 Spring 的过程中,不可避免要掌握代理模式。这篇文章总结一下代...
    99+
    2022-11-13
  • Java静态代理与动态代理案例详解
    代理模式 代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象...
    99+
    2022-11-12
  • Java动态代理与静态代理实例分析
    这篇文章主要介绍了Java动态代理与静态代理实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java动态代理与静态代理实例分析文章都会有所收获,下面我们一起来看看吧。一、静态代理静态代理的使用静态代理,代...
    99+
    2023-07-02
  • Java的动态代理和静态代理详解
    目录0、代理模式1、静态代理2、 加深理解3、动态代理动态代理的例子总结0、代理模式 为什么要学习代理模式?这是SpringAOP的底层【SpringAOP和SpringMVC】 代...
    99+
    2022-11-13
  • Java中动态代理和静态代理的示例分析
    这篇文章主要介绍了Java中动态代理和静态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。0、代理模式为什么要学习代理模式?这是SpringAOP的底层【Spri...
    99+
    2023-06-29
  • Java静态代理和动态代理的深入讲解
    代理模式 代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对...
    99+
    2022-11-12
  • JavaJDK与cglib动态代理有什么区别
    目录一、说明二、区别三、代码示例3.1 静态代理3.2 jdk动态代理3.3 cglib动态代理一、说明 1.spring aop中的动态代理主要有两种方式,jdk动态代理和cgli...
    99+
    2023-03-20
    Java JDK与cglib动态代理 Java JDK动态代理 Java cglib动态代理
  • 解析Spring中的静态代理和动态代理
    目录一、静态代理1.1、静态代理的使用1.2、与装饰者模式的区别二、动态代理2.1、JDK 动态代理2.2、CGlib 动态代理实现一、静态代理 1.1、静态代理的使用 静态代理,代...
    99+
    2022-11-12
  • Spring中静态代理和动态代理有什么不同
    本篇文章为大家展示了Spring中静态代理和动态代理有什么不同,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、静态代理1.1、静态代理的使用静态代理,代理类和被代理的类实现了同样的接口,代理类同时...
    99+
    2023-06-15
  • C#中静态变量与非静态变量的区别有哪些
    这篇文章主要为大家展示了“C#中静态变量与非静态变量的区别有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#中静态变量与非静态变量的区别有哪些”这篇文章吧。静态变量:静态变量使用 stat...
    99+
    2023-06-17
  • 怎么理解Java和SAP ABAP的静态代理和动态代理
    本篇内容介绍了“怎么理解Java和SAP ABAP的静态代理和动态代理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下图是某应用里方法的常规...
    99+
    2023-06-02
  • linux中动态库和静态库的区别有哪些
    这篇文章将为大家详细讲解有关linux中动态库和静态库的区别有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。区别:1、静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库;动态库在程序...
    99+
    2023-06-25
  • Java动态代理的方式有哪些
    这篇文章主要介绍“Java动态代理的方式有哪些”,在日常操作中,相信很多人在Java动态代理的方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java动态代理的方式有哪些”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-26
  • java中静态属性与动态属性的区别
    为什么static不用创建对象就可以被调用?在未创建对象之前,所有静态属性或方法都放在元数据区里,静态的可通过类名调用。例如:public class Cat{ public static String name;//静态的,不创建...
    99+
    2020-07-14
    java入门 java 静态属性 动态属性 区别
  • java静态方法和非静态方法的区别有哪些
    这篇文章给大家分享的是有关java静态方法和非静态方法的区别有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作