【java】--- 静态代理、jdk动态代理和cglib剖析

Java代理模式深度解析:从静态代理到动态代理(JDK/CGLIB)实战 代理模式是面向对象编程中实现功能增强和访问控制的核心设计模式,其核心思想是通过一个代理对象来间接访问真实对象,从而在不修改原始代码的前提下,实现日志记录、性能监控、事务管理等横切关注点。从原理上看,代理分为静态代理和动态代理两大类。静态代理在编译期确定,需要为每个目标类手动编写代理类,适用于简单场景;而动态代理则在运行时动态生成代理类,极大地提升了灵活性和代码复用性,是现代化框架的基石技术。在Java生态中,动态代理主要有两种实现方式:JDK动态代理基于接口和反射机制,要求目标对象实现接口;CGLIB动态代 阅读详情

Git地址:https://github.com/BeatBoxerLrd/MySSM

一、静态代理

代理类和被代理类实现同一接口,在编译之后,运行之前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了

缺点:如果接口增加一个方法,业务类实现之外,所有的代理类也需要实现此方法

1.首先定义一个接口,说明业务逻辑;

package com.derry.proxy;

/**
 * @Author:derry
 * @Description: 定义业务逻辑接口
 * @Date: Created in 15:13 2019/2/19
 * @Modified By:
 */
public interface Book {
    public void  addBook();
}

2.定义业务实现类,实现业务逻辑接口;

package com.derry.proxy.impl;

import com.derry.proxy.Book;

/**
 * @Author:derry
 * @Description:
 * @Date: Created in 15:26 2019/2/19
 * @Modified By:
 */
public class BookImpl implements Book {
    @Override
    public void addBook() {
        System.out.println("新增图书方法!");
    }
}

3:定义业务代理类:

通过组合,在代理类中创建一个业务实现类对象来调用具体的业务方法;

通过实现业务逻辑接口,来统一业务方法;

在代理类中实现业务逻辑接口中的方法时,进行预处理操作、通过业务实现类对象调用真正的业务方法、进行调用后操作的定义;

package com.derry.proxy.impl;

import com.derry.proxy.Book;

/**
 * @Author:derry
 * @Description:
 * 代理类和被代理类实现同一接口,在编译之后,运行之前就已经存在代理类的字节码文件,        
 * 代理类和委托类的关系在运行前就确定了
 * 缺点:如果接口增加一个方法,业务类实现之外,所有的代理类也需要实现此方法
 * @Date: Created in 15:29 2019/2/19
 * @Modified By:
 */
public class BookProxy implements Book {
    private BookImpl bookImpl;

    public BookProxy(BookImpl bookImpl) {
        this.bookImpl = bookImpl;
    }

    @Override
    public void addBook() {
        System.out.println("代理过程开始-------------");
        bookImpl.addBook();
        System.out.println("代理过程结束-------------");

    }
}

4.调用示例;


/**
 * @Author:derry
 * @Description:
 * 定义业务代理类:通过组合,在代理类中创建一个业务实现类对象来调用具体的业务方法;
 * 通过实现业务逻辑接口,来统一业务方法;
 * 在代理类中实现业务逻辑接口中的方法时,进行预处理操作、通过业务实现类对象调用真正的业务方法、进行调用后操作的定义。
 * @Date: Created in 15:32 2019/2/19
 * @Modified By:
 */
public class TestProxy {
    public static void main(String[] args) {
        Book bookProxy = new BookProxy(new BookImpl());
        bookProxy.addBook();
    }
}

5.调用结果;

jd

二、jdk动态代理

        JDK动态代理所用到的代理类在程序调用到代理类对象时才由JVM真正创建,JVM根据传进来的 业务实现类对象 以及 方法名 ,动态地创建了一个代理类的class文件并被字节码引擎执行,然后通过该代理类对象进行方法调用。

       优点:解决了静态代理中,代理必须要实现接口中的方法。
       缺点:需要提供接口。

 1:首先,定义业务逻辑接口;

package com.derry.JdkProxy;

/**
 * @Author:derry
 * @Description: 业务类接口
 * @Date: Created in 16:04 2019/2/19
 * @Modified By:
 */
public interface Book {
    public void addBook();
}

2:然后,实现业务逻辑接口创建业务实现类;

package com.derry.JdkProxy.impl;

import com.derry.JdkProxy.Book;

/**
 * @Author:derry
 * @Description: 业务的真实实现类
 * @Date: Created in 16:05 2019/2/19
 * @Modified By:
 */
public class BookImpl implements Book {
    @Override
    public void addBook() {
        System.out.println("新增图书的方法!");
    }
}

3:最后,实现调用管理接口InvocationHandler(反射包下的),创建动态代理类;

package com.derry.JdkProxy.impl;



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

/**
 * @Author:derry
 * @Description: jdk动态代理
 *  JDK动态代理所用到的代理类在程序调用到代理类对象时才由JVM真正创建,
 *  JVM根据传进来的业务实现类对象以及方法名 ,
 *  动态地创建了一个代理类的class文件并被字节码引擎执行,然后通过该代理类对象进行方法调用。
 *  优点:解决了静态代理中,代理必须要实现接口中的方法
 *  缺点:需要提供接口
 * @Date: Created in 16:07 2019/2/19
 * @Modified By:
 */
public class JdkBookProxy implements InvocationHandler {
    //用于表示业务实现类对象,用来调用真正的实现方法
    private Object target;
    //绑定业务对象,并返回一个代理类
    public Object bind(Object target){
        this.target = target;
        //通过反射机制,创建一个代理类对象实例并返回。用户进行方法调用时使用
        /**三个参数,详细说明
          * 1.一个ClassLoader loader,定义了他由那个classLoader对象生成代理类进行加载
          * 2.一个Class<?>[] interfaces,定义了代理对象所提供的接口
          * 3.一个InvocationHandler h,表示当动态代理对象调用方法的时候会关联到哪一个InvocationHandler对象
          */
        return Proxy.newProxyInstance(this.target.getClass().getClassLoader(),this.target.getClass().getInterfaces(),this);
    }



    //返回的代理类调用方法时,会执行到这里,最终通过反射完成调用
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        System.out.println("调用开始--------");
        //通过反射调用真正的业务实现方法
        result = method.invoke(target,args);
        System.out.println("调用完成----------");
        return result;
    }
}

4.调用示例;

package com.derry.Test;

import com.derry.JdkProxy.Book;
import com.derry.JdkProxy.impl.BookImpl;
import com.derry.JdkProxy.impl.JdkBookProxy;

/**
 * @Author:derry
 * @Description:
 * 在使用时,首先创建一个业务实现类对象和一个代理类对象,
 * 然后定义接口引用(这里使用向上转型)并用代理对象.bind(业务实现类对象)的返回值进行赋值。
 * 最后通过接口引用调用业务方法即可。
 * (接口引用真正指向的是一个绑定了业务类的代理类对象,所以通过接口方法名调用的是被代理的方法们)
 * @Date: Created in 16:23 2019/2/19
 * @Modified By:
 */
public class TestJdkProxy  {
    public static void main(String[] args) {
        BookImpl bookImpl = new BookImpl();
        JdkBookProxy proxy = new JdkBookProxy();
        Book book = (Book) proxy.bind(bookImpl);
        book.addBook();
    }
}

5.调用结果;

三、cglib动态代理

       解决了jdk动态代理必须提供接口的这个缺陷,但是对final修饰的类无法代理;因为其要为代理类生成父类,final无法被继承,enhancer.setSuperclass(this.target.getClass());

       cglib是针对类来实现代理的,原理是对指定的业务类生成一个子类,并覆盖其中业务方法实现代理。因为采用的是继承,所以不能对final修饰的类进行代理。

       注意:测试cglib代理,首先需要添加spring-core依赖;

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>5.0.1.RELEASE</version>
</dependency>
 

 1:首先定义业务类,无需实现接口(当然,实现接口也可以,不影响的,是由于setSuperclass源码)

public void setSuperclass(Class superclass) {
        if (superclass != null && superclass.isInterface()) {
            this.setInterfaces(new Class[]{superclass});
        } else if (superclass != null && superclass.equals(Object.class)) {
            this.superclass = null;
        } else {
            this.superclass = superclass;
        }

    }
package com.derry.CglibProxy.impl;

/**
 * @Author:derry
 * @Description:
 * @Date: Created in 17:32 2019/2/19
 * @Modified By:
 */
public class BookImpl {
    public void addBook(){
        System.out.println("新增图书!");
    }
}

2:实现 MethodInterceptor方法代理接口,创建代理类;

package com.derry.CglibProxy.impl;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @Author:derry
 * @Description:
 * 解决了jdk动态代理必须提供接口的这个缺陷,但是对final修饰的类无法代理
 * cglib是针对类来实现代理的,原理是对指定的业务类生成一个子类,并覆盖其中业务方法实现代理。
 * 因为采用的是继承,所以不能对final修饰的类进行代理。
 * @Date: Created in 17:33 2019/2/19
 * @Modified By:
 */
public class CglibBookProxy implements MethodInterceptor {
    //业务类对象,供代理方法中进行真正的业务方法调用
    private Object target;

    //创建代理类对象
    public Object getInstance(Object target){
        this.target = target;
        //创建增强器,用来创建动态代理类
        Enhancer enhancer  = new Enhancer();
        //为加强器指定要代理的业务类,即为代理类指定父类
        enhancer.setSuperclass(this.target.getClass());
        //设置回调:用于代理类上所有方法的调用,都会调用callback
        enhancer.setCallback(this);
        //创建并返回动态代理类对象并返回
        return enhancer.create();
    }

    //回调方法的调用
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("调用开始-----");
        methodProxy.invokeSuper(o,objects);
        System.out.println("调用结束-----");
        return null;
    }
}

3.测试示例;

package com.derry.Test;

import com.derry.CglibProxy.impl.BookImpl;
import com.derry.CglibProxy.impl.CglibBookProxy;

/**
 * @Author:derry
 * @Description:
 * 创建业务类和代理类对象,然后通过代理类对象.getInstance(业务类对象)
 * 返回一个动态代理类对象(它是业务类的子类,可以用业务类引用指向它)。
 * 最后通过动态代理类对象进行方法调用。
 * @Date: Created in 18:06 2019/2/19
 * @Modified By:
 */
public class TestCglibProxy {
    public static void main(String[] args) {
        BookImpl bookImpl = new BookImpl();
        CglibBookProxy cglibBookProxy = new CglibBookProxy();
        BookImpl book = (BookImpl) cglibBookProxy.getInstance(bookImpl);
        book.addBook();
    }
}

4.完成调用;

深入剖析Java代理模式:静态代理与动态代理的实战应用 掌握代理模式是成为Java高级开发者的必备技能。不同的代理实现方式各有特点,理解其原理和适用场景,能够帮助我们在实际开发中做出更合理的技术选型。建议读者在理解本文示例的基础上,结合Spring框架源码深入分析代理模式的高级应用。 阅读详情

相关推荐

Edge主页被2345劫持?手动清理注册表与组策略的完整方案

浏览器主页劫持是Windows系统中常见的恶意篡改行为,其原理是通过修改注册表、快捷方式、组策略等多处系统配置,强制锁定浏览器启动页。这类劫持不仅影响上网体验,还可能带来隐私泄露和恶意软件感染风险。在安全防护与系统优化场景中,掌握手动清理主页劫持的技能至关重要。本文针对Edge主页被2345导航劫持的问题,深入解析劫持入口,提供从快捷方式、注册表到组策略的逐层清理步骤,并给出防复发策略,帮助用户彻底摆脱顽固劫持。

weixin_30582943的博客 381

8、代理模式

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34166472的博客 150

【电机学复习笔记】同步电机的特性及参数的求取

同步电机的主要特性包括:空载特性、短路特性、零功率因数负载特性、外特性和调整特性。 基于以上特性我们可以实现: 从空载特性和短路特性求同步电抗的不饱和值和短路比; 从零功率因数负载特性和空载特性确定保梯电抗(定子漏抗)和电枢反应电动势

Pantrick_的博客 2万+

Java | 静态代理与动态代理真的超简单

静态代理: 由我们开发者自己手动创建或者在程序运行前就已经存在的代理类,静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。 动态代理: 在程序运行时,运用java反射机制动态创建而成,静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,只有在运行时才知道,通常动态代理实现方式是通过实现 jdk 的 InvocationHandler 接口的 invoke 方法 代码实践 需要代理的接口 interface IBook { fun toBookName(name: Strin

petterp的博客 519

控制障碍函数(Control Barrier Function,CBF) 二、示例

使用一个经典简单的示例讲解CBF的推导

Lyajpunov的博客 6429

关于Vscode配置Unity环境时的一些报错问题(持续更新)

3.找到设置文件,添加如下代码,用于告诉VSCode)在处理 C# 项目时优先使用 C# 扩展来加载和管理项目,而不是使用 C# Dev Kit 或其他扩展。1.很可能是unity的插件版本问题,打开window > package manager将。2.很可能是项目文件的问题,建议unity打开edit > perfercenes。3.手动重装其他版本的.Net框架(去官网找,多下几个无所谓的)解决:(由于造成问题不一样,所以建议都尝试一次)下载net请求超时(一般都会超时很正常的)

bug制造机 1887

Java动态代理——cglib动态代理解析

名词解释 静态代理:编译期就已确定代理对象。即编码出代理类。 动态代理:运行时动态生成代理对象。可对被代理类做出统一的处理,如日志打印,统计调用次数等。 cglib动态代理:cglib工具包实现的动态代理生成方式,通过字节码来实现动态代理,不需要被代理类必须实现接口。 1. 举例 使用cglib代理需要引入两个包,maven的话包引入如下 ...

zhaoquanwei2018的博客 1062

深入解析SAP MM模块OBYC自动科目分配机制:从T030表到实战配置

本文深入解析SAP MM模块中OBYC自动科目分配机制,阐明其作为连接物流与财务核心桥梁的作用。文章以T030表为核心,详细拆解其字段结构与检索逻辑,并通过采购收货、生产发料等实战场景,手把手演示配置步骤与关键要点,帮助读者掌握从原理到实践的完整知识体系,实现业财无缝对接。

nft7creator的博客 356

代理模式详解:静态代理、JDK 动态代理与 CGLib 动态代理

本文详细介绍了Java中的三种代理模式实现方式。静态代理通过手动编写代理类实现,简单但扩展性差;JDK动态代理基于反射机制动态生成代理对象,需目标类实现接口;CGLib动态代理通过继承目标类生成子类代理,无需接口支持。三种方式各有特点:静态代理易理解但代码重复,JDK动态代理支持任意接口但要求目标类必须实现接口,CGLib动态代理最灵活但无法代理final类/方法。代理模式是Spring AOP等框架的核心基础,掌握其原理有助于深入理解框架底层机制。

小旭9527的博客 845

gRPC之gRPC开发流程与入门案例

gRPC之gRPC开发流程与入门案例

YIYIYI 3757

如何缩减layout电路面积?减少晶体管的数量——以全加器为例【VLSI】

How to reduce the number of transistors to reduce circuit area? -- Take the Binary Full Adder as an example 优化面积的方法 1. 减少晶体管的数量 2. 改变gate matrix的布局

Jie_MSD的博客 6431

SpringAOP:Java 三大代理模式:从静态代理到 JDK & CGLIB 动态代理

本文介绍了Java中的三种代理模式及其在Spring AOP中的应用。首先通过"房东租房"案例展示了静态代理的实现方式,指出了其代码冗余的缺点。接着详细讲解了JDK动态代理和CGLIB动态代理的实现原理,前者需要目标类实现接口,后者则通过生成子类实现代理。文章还分析了Spring框架如何根据目标类是否有接口来选择代理方式,并解释了Spring Boot 2.x版本后默认使用CGLIB代理的原因——它能更好地兼容业务代码中的类型注入。三种代理模式是理解Spring AOP底层机制的重要基础

此人很懒,什么都留下了...快进来看看吧 731

基于FFT的轴承故障诊断 - MATLAB代码和详细解释

最后,我们可以根据异常特征的位置和特征分析来确定轴承故障的类型。最后,我们可以根据异常特征的位置和特征分析来确定轴承故障的类型。因此,通过分析频谱图,我们可以识别轴承故障的特征。因此,通过分析频谱图,我们可以识别轴承故障的特征。我们可以选择适当的阈值,并在频谱图上标记异常特征。通过这种基于FFT的轴承故障诊断方法,我们可以快速、准确地检测和诊断轴承故障。接下来,我们将应用FFT来获取振动信号的频谱信息,频谱显示了信号在不同频率上的能量分布。通过将异常特征标记在频谱图上,我们可以直观地识别轴承故障的存在。

COWizard的博客 613

【Spring从成神到升仙系列 一】2023年再不会动态代理,就要被淘汰了

在 Spring 中,最重要的应该当属 IOC 和 AOP 了,IOC 的源码流程还比较简单,但 AOP 的流程就较为抽象了。其中,AOP 中代理模式的重要性不言而喻,但对于没了解过代理模式的人来说,痛苦至极。于是,我就去看了动态代理的实现,发现网上大多数文章讲的都是不清不楚,甚至讲了和没讲似的,让我极其难受。本着咱们方向主打的就是源码,直接从从源码角度讲述一下代理模式。

爱敲代码的小黄 5671

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

支撑Java框架的基础技术:泛型,反射,动态代理,cglib

以Spring为例要想看明白他的源码需要彻底理解Java的一些基础技术泛型,反射同时对于一些高级技术例如动态代理,cglib和字节码技术也需要掌握,下面就按章节来一一说清楚这些技术的核心部分,最后手写一个简单的Spring框架。 一.静态代码块和非静态代码块以及构造函数的调用顺序 静态代码块:https://stackoverflow.com/questions/2420389/s...

深度Java 7863

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java动态代理原理大揭秘:面试官最爱的灵魂拷问!

动态代理本质上是一种元编程手段,在框架开发中应用广泛(比如Spring的AOP、MyBatis的Mapper接口实现等)。理解其原理不仅能帮你通过面试,更能提升对Java生态的理解深度。两种实现方式及其原理性能对比和使用场景实际开发中的注意事项最后友情提示:看十遍不如手写一遍!赶紧打开IDE把文中的示例代码敲一遍,保准记忆深刻~

bestbee888的博客 915

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【Java设计模式】——代理模式

代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用,代理模式是Java许多框架底层应用最广泛的设计模式之一,本文将介绍代理模式中的静态代理和动态代理,其中动态代理包括JDK动态代理、CGLib动态代理

雪月清的博客 2904

Java代理模式深度解析:静态代理 vs 动态代理 vs CGLIB

代理模式是Java开发中最核心的设计模式之一,也是Spring AOP的底层基石。但很多同学写了三年Java,对静态代理、JDK动态代理、CGLIB代理的区别还是一知半解。这篇文章从源码级别拆解三种代理的实现原理,对比它们的性能差异和适用场景,最后结合Spring AOP的源码,看看Spring到底是怎么选代理的。看完这篇,面试问代理模式,你可以直接和他聊源码。代理模式(Proxy Pattern)属于结构型设计模式。不直接访问目标对象,而是通过一个代理对象来间接访问。听起来很简单对吧?

m0_69632475的博客 254

Java代理模式深度解析:静态代理与动态代理(JDK/CGLIB)实战对比

代理模式是面向对象编程中实现控制访问和功能增强的核心设计模式,其核心原理是通过一个代理对象来间接访问真实对象,从而在不修改原有代码的基础上增加额外逻辑。从技术实现层面,代理主要分为静态代理和动态代理两大类,其中动态代理又包含基于接口的JDK动态代理和基于继承的CGLIB字节码增强。理解其底层机制,对于掌握Java高级特性及Spring等主流框架的AOP实现至关重要。在实际工程中,代理模式广泛应用于日志记录、事务管理、权限控制等横切关注点,能有效提升代码的模块化和可维护性。本文聚焦于Java代理模式,通过对比

weixin_30621959的博客 383

Java中的代理(Proxy)

设计模式--Proxy 增强一个对象的功能 买火车票,app就是一个代理,他代理了火车站,小区当中的代售窗口 java当中如何实现代理 一,java实现的代理的两种办法(静态代理和动态代理) 1,继承 代理对象继承目标对象,重写需要增强的方法; 缺点:会代理类过多,非常复杂 1,新建一个接口(LubanDao 接口) package com.huaxu.dao; public...

weixin_39704652的博客 970

Java 动态代理:隐藏在接口背后的魔法世界

最近在帮团队做技术面试时,发现 80% 的候选人说不清动态代理的实现原理(特别是那些号称 3 年工作经验的开发者)。这玩意儿看起来简单,但实际开发中要是用不好,轻则性能暴跌,重则内存泄漏!今天咱们就来扒一扒这个 Java 核心机制的内裤,看完保证你下次面试能吊打面试官!

2501_91408482的博客 847

代理模式(子类代理、静态代理、动态代理)

代理模式(子类代理、静态代理、动态代理)

蔡林浩的博客 626

《Java 100 天进阶之路》第27篇:Java代理类详解

本文介绍了Java代理模式详解:通过静态代理和动态代理(JDK/CGLIB)实现对目标对象的访问控制。静态代理需手动编写代理类,动态代理则运行时生成。JDK动态代理基于接口,使用InvocationHandler拦截方法调用;CGLIB通过继承生成子类代理。典型应用包括AOP编程、日志记录和事务管理。文章提供了静态代理、JDK动态代理和CGLIB代理的代码示例,并对比了两者的区别与适用场景。同时指出了常见错误如无限递归、final类代理等问题,最后给出动态代理在Spring框架中的实际应用场景。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 902

【代理模式】静态代理&动态代理原理分析

(1)Java 是单继承(extend)语言,JDK 动态代理生成的代理类已经固定继承了java.lang.reflect.Proxy类,无法再继承业务实现类;(2)要想获取并增强业务实现类的方法,要么使用extend继承父类,要么使用implements实现接口,现在继承的路子走不通了,就只能使用implements实现接口了,所以要求只能代理实现了接口的类。(1)Spring AOP 是动态代理集大成者,内置两套 JDK/CGLIB 动态代理自动切换;

weixin_44823875的博客 347

【SSM】15-动态代理模式的使用总结

目录 一、代理模式 二、静态代理 (一)静态代理 (二)静态代理简单实现 三、动态代理 (一)动态代理 (二)动态代理简单实现 四、动态代理原理分析 五、InvocationHandler接口和Proxy类详解 六、JDK动态代理和CGLIB动态代理代码示例比较与总结 (一)定义创建用户管理接口 (二)用户管理实现类,实现用户管理接口(被代理的实现类) (三)采用JDK代理实现:JDK动态...

m0_50964976的博客 545
上一篇: 【java】--- 反射获取Class类的4种方式
下一篇: 【sql】--- sql注入攻击
Beat_Boxer
博客等级 码龄9年 18粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值