jdk代理和cglib代理

article/2025/10/31 13:27:23

1.jdk代理

描述:jdk代理,就是一个类A实现某个接口G,重写了G的方法。现在要对A的方法进行增强,但是不要修改A的代码。所以创建类B,也实现接口G,在这个方法里面写增强业务,但是具体方法调用A的。
要求:

  • 被代理的类必须实现接口

核心类

  • Proxy 是jdk提供的代理类
  • newProxyInstance(被代理类的类加载器,被代理类的接口,业务处理接口) 静态方法,用于创建一个代理实例
  • InvocationHandler 具体代理业务处理的方法
    核心代码:

动物接口接口:

public interface Animal{void swimming();
}

狗类

public class Dog implements Animal{@Overridepublic void swimming(){System.out.println("狗正在游泳");}
}

生成代理:

/*** jdk的动态代理* 实现动态代理的要求是,必须有接口实现。* 所生成的代理对象也是实现这个接口的,只是具体的方法调用,来自被代理的对象的*/
public class P7 {public static void main(String[] args) {DogProxy dogProxy = new DogProxy();Animal dogProxyInstance = (Animal) dogProxy.getInstance(new Dog());dogProxyInstance.swimming();}
}/*** 对狗进行代理,从而改良狗的行为.*/
class DogProxy implements InvocationHandler {private Object target;public Object getInstance(Object target){this.target=target;//实现代理return Proxy.newProxyInstance(this.target.getClass().getClassLoader(),this.target.getClass().getInterfaces(),this);}//代理所做处理的具体业务@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("当前时间:"+System.currentTimeMillis()+" 使用狗刨式");Object o = method.invoke(this.target, args);//调用 [被代理的方法]System.out.println("结束时间:"+System.currentTimeMillis()+ "使用仰泳式");return o;}
}

在这里插入图片描述

2.cglib代理

描述:cglib代理又称子类代理。一个类A,要对其方法进行增强,但是,这个类没有实现接口。现在创建一个类继承类A,重写方法,但是具体业务还是调用父类的。只是在这个方法里面进行额外添加小功能而已。
要求:

  • 被代理的类不能被final修饰

核心类:

  • Enhancer :增强器类,用于创建代理对象的类
  • setSuperclass(Object target):设置目标要代理的对象,即设置父类对象
  • setCallback(Callback[] callbacks):设置代理业务的具体处理,参数是实现MethodInterceptor 接口类的实例对象
  • create():调用此方法,创建代理对象

核心代码:
被代理的类: pig类

class Pig{public void sing(){System.out.println("this pig is singing");}
}

代理类:

/*** 进行CGlib代理的类*/
class CglibPig implements MethodInterceptor {private Object target;public Object getInstance(Object target) {this.target = target;Enhancer enhancer=new Enhancer();//指定被代理的对象  即父类enhancer.setSuperclass(this.target.getClass());//设置代理处理的回调  MethodInterceptor的实现类enhancer.setCallback(this);//创建代理对象Object o = enhancer.create();//返回return o;}/***进行代理处理的业务*/@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("参数查看:");System.out.println(o.getClass());  //当前代理对象System.out.println(method.getClass()); //代理对象的方法System.out.println(Arrays.toString(objects));  //代理对象的参数System.out.println(methodProxy.getClass()); System.out.println("cglib,小猪唱歌前,准备热身");//因为是子类代理,所有要调用父类的方法Object o1 = methodProxy.invokeSuper(o, objects);System.out.println("cglib,小猪唱歌后,全身都是汗");return o1;}
}

main类演示:

public class P6 {public static void main(String[] args) {//创建代理对象,指定被代理的类CglibPig cglibPig=new CglibPig();Pig p= (Pig)cglibPig.getInstance(new Pig());System.out.println(p.getClass());p.sing();}
}

在这里插入图片描述


http://chatgpt.dhexx.cn/article/Sa6Qdr29.shtml

相关文章

cglib代理解析

工作原理 使用 <dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version></dependency>对类和接口分别进行代理 DemoService package com.fanqiechaodan.user.service;/*** author fa…

CGLib之Enhancer

Enhancer允许为非接口类型创建一个Java代理。Enhancer动态创建了给定类型的子类但是拦截了所有的方法。和Proxy不一样的是&#xff0c;不管是接口还是类他都能正常工作。 来个场景模拟一下AOP package cglib.enhancer;public class Hello {public String sayHello(boolean thr…

cglib源码学习交流

背景 前段时间在工作中&#xff0c;包括一些代码阅读过程中&#xff0c;spring aop经常性的会看到cglib中的相关内容&#xff0c;包括BeanCopier,BulkBean,Enancher等内容&#xff0c;以前虽大致知道一些内容&#xff0c;原理是通过bytecode&#xff0c;但没具体深入代码研究&a…

CGLib浅析

CGLib浅析 什么是CGLib CGLIB实现动态代理&#xff0c;并不要求被代理类必须实现接口&#xff0c;底层采用asm字节码生成框架生成代理类字节码(该代理类继承了被代理类)。 所以被代理类一定不能定义为final class并且对于final 方法不能被代理。 实现需要 //MethodIntercept…

CGLIB

1、CGLIB 官网&#xff1a;http://cglib.sourceforge.net CGLIB是一个强大的高性能的代码生成包。它被许多AOP的框架&#xff08;例如Spring AOP&#xff09;使用&#xff0c;为他们提供方法的interception&#xff08;拦截&#xff09;。 Hibernate也使用CGLIB来代理单端si…

CGLIB代理到底是个什么东西?这是一篇最全的CGLIB大全

目录 0 概述 0.1 CGLIB包结构 1 使用CGLIB实现动态代理 1.1 CGLIB代理相关的类 1.2 CGLIB动态代理的基本原理 1.3 使用MethodInterceptor接口实现方法回调 1.3.1 实现MethodInterceptor接口 1.4 使用CGLIB代理最核心类Enhancer生成代理对象 1.5 使用CGLIB继进行动态代理…

什么是CGLIB,CGLIB使用简介

什么是CGLIB CGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架&#xff08;Spring、dynaop&#xff09;中&#xff0c;用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架&#xff0c;同样使用CGLIB来代理单端&#xff08;多对一和一对一&#xff09;…

cglib动态代理 | 如何生成代理类、代理类内容解析

文章目录 简介一、cglib动态代理有什么特点CgLib动态代理&#xff1a;优点&#xff1a;缺点&#xff1a; 二、Cglib如何生成代理类生成代理类的具体代码&#xff1a;生成代理对象的具体代码&#xff1a; 三、代理类内容解析持久化代理类&#xff1a;代理类内容&#xff1a; Cgl…

CGLib是什么

什么是CGLIB CGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架&#xff08;Spring、dynaop&#xff09;中&#xff0c;用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架&#xff0c;同样使用CGLIB来代理单端&#xff08;多对一和一对一&#xff09;…

什么是CGLIB,CGLIB使用简介,cglib

什么是CGLIB&#xff0c;CGLIB使用简介 2018年08月20日 10:41:31 axiaositong 阅读数&#xff1a;348 什么是CGLIB CGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架&#xff08;Spring、dynaop&#xff09;中&#xff0c;用以提供方法拦截操作。Hibernate作为…

(转帖)Cglib和jdk动态代理的区别及运行性能比较

动态代理解决了方法之间的紧耦合&#xff0c;IOC解决了类与类之间的紧耦合&#xff01; Cglib和jdk动态代理的区别&#xff1f; 1、Jdk动态代理&#xff1a;利用拦截器&#xff08;必须实现InvocationHandler&#xff09;加上反射机制生成一个代理接口的匿名类&#xff0c;在…

CGLib动态代理原理

CGLib动态代理原理 CGLib动态代理是代理类去继承目标类&#xff0c;然后重写其中目标类的方法啊&#xff0c;这样也可以保证代理类拥有目标类的同名方法&#xff1b; 看一下CGLib的基本结构&#xff0c;下图所示&#xff0c;代理类去继承目标类&#xff0c;每次调用代理类的方…

CGLib介绍

1. CGLIB介绍 CGLIB(Code Generation Library)是一个开源项目&#xff01;是一个强大的&#xff0c;高性能&#xff0c;高质量的Code生成类库&#xff0c; 它可以在运行期扩展Java类与实现Java接口。CGLIB是一个强大的高性能的代码生成包。它广泛的被许多AOP的框架使用&#…

cglib的简单使用

一、前言 最近在看Spring的源码&#xff0c;其中有牵扯到cglib的相关内容&#xff0c;遂简单记录下cglib是如何使用的 二、原理&#xff08;节选自网络&#xff09; CGLIB原理&#xff1a;动态生成一个要代理类的子类&#xff0c;子类重写要代理的类的所有不是final的方法。…

cglib动态代理

前面介绍了代理模式和JAVA动态代理&#xff0c;这片文章主要解析cglib动态代理实现。 基本介绍 CGLIB&#xff08;Code Generation Library&#xff09;&#xff0c;是一个强大的&#xff0c;高性能&#xff0c;高质量的 Code 生成类库&#xff0c;它可以在运行期扩展 Java 类…

动态代理之 cglib 实现

&#xff08;尊重劳动成果&#xff0c;转载请注明出处&#xff1a;https://blog.csdn.net/qq_25827845/article/details/87513102冷血之心的博客&#xff09; 目录 前言&#xff1a; 正文&#xff1a; AOP&#xff08;面向切面编程&#xff09; JDK动态代理 cglib实现动态…

CGLIB介绍与原理

一、什么是 CGLIB? CGLIB是一个功能强大&#xff0c;高性能的代码生成包。它为没有实现接口的类提供代理&#xff0c;为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理&#xff0c;但当要代理的类没有实现接口或者为了更好的性能&#xff0c;CGLIB是一个…

CGLIB(Code Generation Library)详解

什么是CGLIB CGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架&#xff08;Spring、dynaop&#xff09;中&#xff0c;用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架&#xff0c;同样使用CGLIB来代理单端&#xff08;多对一和一对一&#xff09;…

【动态代理】CGLIB 动态代理的使用及原理

1. CGLIB 动态代理介绍 什么是 CGLIB&#xff1f; CGLIB是一个功能强大&#xff0c;高性能的代码生成包。它为没有实现接口的类提供代理&#xff0c;为JDK的动态代理提供了很好的补充。 通常可以使用Java的动态代理创建代理&#xff0c;但当要代理的类没有实现接口或者为了更…

CGLIB详解(最详细)

转载地址:https://blog.csdn.net/danchu/article/details/70238002 什么是CGLIB CGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架&#xff08;Spring、dynaop&#xff09;中&#xff0c;用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架&#xff0c…