浅谈静态代理与动态代理

Buck芯片参数耦合实操指南:电感选型、BOOT电阻与COT架构 Buck转换器作为最基础的DC-DC拓扑,其本质是能量脉冲搬运系统,而非简单降压模块。理解其工作原理需突破理想模型,关注MOSFET开关行为、电感非理想特性(DCR/Isat/SRF)及电容寄生参数(ESR/ESL)之间的动态耦合。技术价值在于规避量产失效——如-20℃掉压、纹波超标、上电振荡等,根源常是参数匹配失衡。典型应用场景涵盖工业电源、无人机电机供电、伺服驱动等对动态响应与热可靠性要求严苛的领域。本文聚焦工程落地,深度解析电感选型、BOOT电阻计算、COT架构适配等热搜关键词背后的物理约束与实测验证 阅读详情

图片来源:https://www.cnblogs.com/bigmonkeys/p/7823268.html

首先,理解一下什么是代理,所谓代理,字面意思就是“代替”、“处理”,就是说一定会有一个代理的对象和一个被代理的对象,代理的对象代替被代理对象来处理一些事情,就好像我们现实生活中的代理商,他来代替厂家来销售产品给消费者,另外代理商会提供其他的服务,并收取额外的费用。所以,可以看出,代理一般有三个必不可少的元素:代理对象、被代理对象以及代理对象提供的其他服务。

静态代理:代理类和目标对象的类在程序编译期间就已经确定。他们都实现相同的接口或继承相同的抽象类。

动态代理:代理类和目标对象的类是在程序运行期间由JVM根据反射等机制动态生成的。

下面来说一下未使用代理之前和使用静态代理、使用动态代理之后的代码有什么区别:

1、未使用代理之前:

(1)创建目标对象

public class RealObject {

    private String name;

    public RealObject(String name) {
        this.name = name;
    }

    public void doSomething() {
        //实现主要逻辑之前的做一些处理
        System.out.println("before process...");
        //要实现的主要(核心)逻辑
        System.out.println(name + " doSomething()...");
        //实现主要逻辑之后的做一些处理
        System.out.println("after process...");
    }

}

(3)测试类:

public class TestNonProxy {

    public static void main(String[] args) {
        RealObject realObject = new RealObject("RealObject");
        realObject.doSomething();
    }
}

测试结果:
before process...
RealObject doSomething()...
after process...

存在问题:非核心逻辑与原有核心逻辑紧耦合,不利于程序的扩展。

2、静态代理

方式一:使用聚合方式(推荐)

(懒得画UML图了,用IDEA自动生成的继承关系代替下,下同)

 (1)创建代理类和被代理(目标)类都需要实现的公共接口:

/**
 * 代理类和被代理类都需要实现的公共接口
 */
public interface CommonInterface {

    void doSomething();

}

(2)被代理(目标)类:

/**
 * 被代理(目标)类
 */
public class RealObject implements CommonInterface {

    private String name;

    public RealObject(String name) {
        this.name = name;
    }

    /**
     * 被代理(目标)对象实现的方法
     */
    @Override
    public void doSomething() {
        System.out.println(name + " doSomething()...");
    }

}

(3)代理类:

/**
 * (静态)代理类
 */
public class Proxy implements CommonInterface {

    /**
     * 被代理对象作为属性(聚合)的方式引入
     */
    private RealObject realObject;

    /**
     * 通过构造器方法给属性(被代理对象)赋值
     *
     * @param realObject 被代理对象
     */
    public Proxy(RealObject realObject) {
        this.realObject = realObject;
    }

    /**
     * 代理对象和被代理对象都实现同一接口的同一个方法,
     * 代理对象可以在调用被代理对象前后添加其他处理逻辑
     */
    @Override
    public void doSomething() {
        System.out.println("before process...");
        realObject.doSomething();
        System.out.println("after process...");
    }

}

(4)测试静态代理(聚合方式):

public class TestProxy {

    public static void main(String[] args) {
        RealObject realObject = new RealObject("RealObject");
        CommonInterface proxy = new Proxy(realObject);
        proxy.doSomething();
    }

}

测试结果:
before process...
RealObject doSomething()...
after process...

 方式二:通过继承方式(不推荐)

就是写一个 RealObject 的子类,然后通过多态的方式在调用子类的方法当中来调用父类的方法,这里不再赘述。

静态代理的优缺点:

(1)优点:扩展原功能的同时,不会侵入原有代码的核心逻辑,实现起来比较简单。

(2)缺点:代理类和被代理类都是在编译期间就确定下来,不利于程序的扩展。每一个代理类只能为一个接口服务,这样在开发过程中要实现不同的功能就会产生很多的代理类。

3、动态代理

Java中实现动态代理的方式常见的有两种:JDK 动态代理和 Cglib 动态代理。

方式一:JDK 动态代理

实现步骤:

(1)创建被代理类要实现的接口

/**
 * 被代理类实现接口
 */
public interface CommonInterface {

    void doSomething();

}

(2)创建被代理类

/**
 * 被代理(目标)类
 */
public class RealObject implements CommonInterface {

    private String name;

    public RealObject(String name) {
        this.name = name;
    }

    /**
     * 被代理(真正目标)对象实现的方法
     */
    @Override
    public void doSomething() {
        System.out.println(name + " doSomething()...");
    }

}

 (3)创建一个实现了 InvocationHandler 接口的实现类

/**
 * 创建一个实现了 java.lang.reflect.InvocationHandler 接口的类
 */
public class MyInvocationHandler implements InvocationHandler {

    /**
     * 被代理对象
     */
    private Object target;

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    /**
     * 实现 Invocation 的 invoke()方法,
     * 所有调用被代理对象方法都会转换成调用此方法来间接调用目标方法
     *
     * @param proxy  动态代理对象
     * @param method 执行被代理对象的目标方法
     * @param args   该执行的方法的参数
     * @return 执行方法后的返回值
     * @throws Throwable 异常
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("before process...");
        Object returnValue = method.invoke(target, args);
        System.out.println("after process...");
        return returnValue;
    }

}

(4)测试JDK动态代理:

/**
 * 测试 JDK 动态代理
 */
public class TestDynamicProxy {

    public static void main(String[] args) {
        //创建被代理对象
        RealObject realObject = new RealObject("RealObject");
        //创建 InvocationHandler 的实现类,并将被代理对象传入
        MyInvocationHandler myInvocationHandler = new MyInvocationHandler(realObject);
        //通过 Proxy 的 newInstance() 方法创建动态代理对象
        CommonInterface ci = (CommonInterface) Proxy.newProxyInstance(
                CommonInterface.class.getClassLoader(),
                new Class<?>[]{CommonInterface.class},
                myInvocationHandler);
        ci.doSomething();
    }

}

测试结果:
before process...
RealObject doSomething()...
after process...

核心API:

Proxy:专门完成代理的操作类,是所有动态代理类的父类。通过此类为一个或多个接口动态地生成实现类。

核心方法:

  • static Class<?> getProxyClass(ClassLoader loader, Class<?>...interfaces) :创建一个动态代理类所对应的 Class 对象。
  • static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h):直接创建一个动态代理对象。

参数说明:

  • loader:类加载器
  • interfaces:被代理类实现的全部接口
  • h:InvocationHandler 接口的实现类实例

方式二:Cglib 动态代理

注:使用 Cglib 动态代理需要导入相关的jar包:cglib-nodep-2.2.2.jar(可以通过 maven 方式下载再导入到工程中)

实现步骤:

(1)创建被代理(目标)类

/**
 * 被代理(目标)类
 * 不需要实现任何接口
 */
public class RealObject {

    private String name;

    public RealObject(String name) {
        this.name = name;
    }

    /**
     * 被代理(真正目标)对象实现的方法
     */
    public void doSomething() {
        System.out.println(name + " doSomeThing()...");
    }

}

 (2)创建一个实现 net.sf.cglib.proxy.MethodInterceptor 拦截器的类

/**
 * 实现 net.sf.cglib.proxy.MethodInterceptor 拦截器
 */
public class CglibProxy implements MethodInterceptor {

    /**
     * 用来创建被代理类的子类(即:代理类)
     */
    private Enhancer enhancer = new Enhancer();

    /**
     * 创建 Cglib 代理对象
     *
     * @param clazz         被代理类的 Class 实例
     * @param argumentTypes 被代理类有参构造器的参数类型数组
     * @param arguments     被代理类有参构造器的参数值数组
     * @return Cglib 代理对象
     */
    public Object getProxy(Class clazz,
                           Class[] argumentTypes,
                           Object[] arguments) {
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        //如果不需要调用有参构造器,则直接使用 enhancer.create() 
        //方法创建对象就行,这里为了通用性,
        //使用create(Class[] argumentTypes, Object[] arguments) 方法
        return enhancer.create(argumentTypes, arguments);
    }

    /**
     * 代理类拦截方法
     *
     * @param obj    Cglib 生成的代理对象
     * @param method 被代理(目标)对象方法的反射对象
     * @param args   被代理(目标)对象方法的参数
     * @param proxy  Cglib代理对象方法
     * @return 返回值
     * @throws Throwable 异常
     */
    @Override
    public Object intercept(Object obj, Method method,
                            Object[] args, MethodProxy proxy)
            throws Throwable {
        //代理类通过 invokeSuper 调用父类的方法
        System.out.println("before process...");
        Object returnValue = proxy.invokeSuper(obj, args);
        System.out.println("after process...");
        return returnValue;
    }

}

(3)创建 Cglib 测试类

/**
 * Cglib 动态代理测试类
 */
public class TestCglibDynamicProxy {

    public static void main(String[] args) {
        CglibProxy cglibProxy = new CglibProxy();
        RealObject realObject = (RealObject) cglibProxy.getProxy(
                RealObject.class,
                new Class[]{String.class},
                new Object[]{"RealObject"}
        );
        realObject.doSomething();
    }

}


测试结果:
before process...
RealObject doSomeThing()...
after process...

 对比 JDK 动态代理和 Cglib 动态代理:

JDK 动态代理:只能对实现了接口的类生成代理,没有实现接口的类不能实现JDK的动态代理;

Cglib 动态代理:是针对类实现代理,主要是对指定的目标类生成一个子类,覆盖其中的方法来拦截对目标类的调用(继承)。

 

总结:无论是静态代理还是动态代理(JDK动态代理和Cglib动态代理),其本质都是一样的,就是使用一个代理对象将原始(目标)对象包装起来,然后通过该代理对象来取代原始(目标)对象,之后任何对原始(目标)对象的调用都要通过代理对象,从而控制外部对原始对象的访问和操作(决定是否以及何时调用原始对象的方法)。

后话:本文只是暂时简单的介绍了一下静态代理和动态代理的实现方式及优缺点,后续会接着介绍动态代理和AOP的关系以及动态代理的实现原理,并会自己手动实现一个简单的动态代理类。

 

本文参考地址:

https://www.cnblogs.com/gonjan-blog/p/6685611.html

https://blog.youkuaiyun.com/briblue/article/details/73928350

https://www.cnblogs.com/bigmonkeys/p/7823268.html

 

浅谈Spring中JDK动态代理和CGLIB动态代理 阅读详情

相关推荐

【java】简述CGLIB常用API

1.概述 转载:简述CGLIB常用API 类似:【Spring】CGLIB动态代理 CGLIB,即Code Generation Library,是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(例如Spring)中,用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架,同样使用CGLIB来代理单端(多对一和一对一)关联(延迟提取集合使用的另一种机制)。CGLIB作为一个开源项目,其代码托管在github,地址为:https://github.com/cglib/cglib。 .

九师兄 572

动态代理最全详解系列[5]-Cglib动态代理源码分析

上一篇我们对Cglib动态代理进行了代码测试,这一篇文章我们看下Cglib实现动态代理的原理,其实分析动态代理弄懂两件事就行:代理类怎么生成的、代理类方法如何调用的被代理类方法。 1 代理类的生成 首先代理类对象是调用enhancer.create()生成的,其中会调用super.create()。 public class Enhancer extends AbstractClassGenerator { public Object create(Class[] argumentTypes, O

qq_43259865的博客 604

鱼眼双目测距实战:从OpenCV标定到SGBM匹配的完整流程解析

本文详细解析了鱼眼双目测距的完整流程,从OpenCV标定到SGBM匹配,涵盖标定、校正、匹配和测距四个关键阶段。通过实战经验分享,帮助开发者解决鱼眼镜头强畸变带来的测距挑战,提升测距精度至5%以内。特别适合机器人导航、自动驾驶和VR领域的开发者参考。

weixin_27298377的博客 123

OpenCode Opus 5:从代码补全到全栈开发伙伴的AI编程助手

AI编程助手是基于人工智能技术的代码生成工具,通过深度学习模型理解编程语言语法和语义。其核心原理是利用大规模代码库训练,学习开发模式与最佳实践。技术价值在于提升编码效率、减少重复劳动,并辅助代码审查与重构。应用场景涵盖日常开发、测试生成、文档编写等软件工程全流程。OpenCode Opus 5作为新一代编程助手,通过项目级代码理解和技能库扩展,实现了从单文件补全到全栈开发的转变。该工具支持多语言深度理解和架构模式识别,帮助开发者处理复杂项目结构和技术栈组合,自然融入现代开发工作流。

weixin_33709219的博客 450

ENSP实验一:防火墙基础配置

配置client(内网)、FTP Server(外网)的IP地址。进入防火墙,输入密码:默认为admin@123。

Carohuan的博客 1万+

告别串口助手!手把手教你用Matlab直接读取STM32的传感器数据(附完整代码)

本文详细介绍了如何利用Matlab直接与STM32进行串口通信,实现传感器数据的实时采集与分析。通过完整的代码示例和系统架构设计,帮助开发者告别传统的串口助手工具链,打造高效、自动化的数据采集系统。文章涵盖了从硬件配置、通信协议设计到Matlab数据处理与可视化的全流程,特别适合嵌入式开发与数据分析结合的实践场景。

weixin_42629671的博客 428

CGLIB 详解

依赖 <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.12</version> &lt...

dizan4060的博客 447

Optisystem软件与Matlab软件的联合数据读取

目录 Matlab软件程序编写 Optisystem软件的连接与设置 数据读取结果 Matlab软件程序编写 利用Matlab软件按照下图编写程序,保存为getdata.m文件。 OutputPort1 =InputPort1; fileID=fopen('OSAdata.txt','wt'); fprintf(fileID,'%f\n',OutputPort1.Sampled.Signal); fclose(fileID); Optisystem软件的连接与设置 (以基于线性插值法

Vivian_Chen_的博客 4853

Spring源码学习

IoC容器 我们总结一下IoC容器初始化的基本步骤:《Spring技术内幕》P28 1.Resource的定位过程 这个Resource的定位指的是BeanDefinition的资源定位,它由ResourceLoader通过统一的Resource接口来完成,这个Resource对各种形式的BeanDefinition的使用都提供了统一接口。比如,文件系统中的Bean定义信息可以使用File...

cuteOpenHeart的博客 225

OpenCV图像去畸变实战指南:从原理到参数调优(附完整代码与效果对比)

本文详细解析了OpenCV图像去畸变的原理与实战方法,对比了三种核心函数(标准、鱼眼、全景模型)的适用场景与效果。重点提供了完整的代码示例,并深入探讨了alpha、焦距、中心点等关键参数的调优技巧,以帮助开发者有效矫正镜头畸变,提升计算机视觉任务精度。

life6的博客 553

BUG调试案例一:RK3588+YT8531网络无法PING通调试案例

在使用 RK3588 搭配 YT8531S PHY 芯片进行网络调试时,遇到了“网络无法 Ping 通”的棘手问题。排查了两天,终于找到问题原因。为了避免大家在类似项目中走弯路,也为了加深自己对调试细节的理解,我们特意整理了本次问题的完整排查过程。本篇文章将围绕以下四个方面展开分享: 问题现象&描述 调试过程&分析 问题根源定位 注意事项提醒 举一反三(走两步)

案例文章,高速信号 2335

浅谈java代理 静态代理动态代理 JDK动态代理和CGLIB动态代理

浅谈java代理 静态代理动态代理 JDK动态代理和CGLIB动态代理

园区阿祖的博客 1313

到底什么是Harness工程?一篇文章从入门到企业落地全解析

随着OpenClaw爆火,Harness Engineering(驾驭工程)成为AI编程时代的热门概念,很多小白对其感到陌生。本文用通俗类比和真实案例,避开复杂术语,从基础定义入手,讲清Harness Engineering的核心逻辑——人类工程师设计“约束系统”(马具),让AI模型(烈马)安全高效地完成代码工作,同时拆解其核心组件、企业落地场景和实战成果,帮小白快速入门,读懂这项能解放人力、提升效率的新技术,轻松掌握它的核心价值和落地思路。

program哲学 3259

浅谈代理模式,静态代理,jdk动态代理

代理模式是一种设计模式,提供了对目标对象的间接访问方式,通过代理访问目标对象,便于在目标实现的基础上增加额外的功能操作,前拦截,后拦截等jdk动态代理依赖于接口来实现,目标类实现某些接口,然后通过目标类实现的接口来创建代理对象,代理对象想要什么样的方法实现又通过invocationHandler对象的invoke()方法来实现。

m0_52492272的博客 1442

【即插即用模块】Transformer篇 | CVPR 2025 | D2T:双域特征融合,完美适配缺陷检测/小目标检测和分割等频域细节敏感的任务!

本文提出了一种基于小波和原型增强的双域Transformer(WPFormer)用于像素级表面缺陷检测。该模型通过Dual-domain Transformer (D2T)模块融合频域和空间域特征:小波增强交叉注意力(WCA)分解高低频特征并加权平衡,增强缺陷细节捕捉;原型引导注意力(PCA)生成全局原型向量强化关键信息聚合。实验表明,该模块在缺陷检测任务中性能优于现有方法,通过频域细节增强和全局依赖建模有效提升了复杂场景下的检测效果。代码已开源,适用于对频域敏感的目标检测和分割任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1374

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

浅谈静态代理和动态代理

1.静态代理,耦合增加,改动较大。 登录接口public class CustomerLoginAction implements LoginAction { //执行验证操作 public void execute() throws SQLException, LoginException { } } 用户登录import java.sql

小菜的粉丝——专栏 549

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

浅谈动态代理和静态代理的底层原理及实现

什么是反射,反射的作用是什么 ​ Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键. java类加载机制 要弄清楚java的反射原理,我们首先需要知道java的类加载机制 *.java文件通过编译器编译成为*.class文件 *.class文件通过类加载器加载到 j

不喝阔落的博客 765

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

利用代码分别实现jdk动态代理和cglib动态代理_浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程的尝试...

这是Jerry 2020年的第44篇文章,也是汪子熙公众号总共第227篇原创文章。文章目录Java的静态代理静态代理的优缺点ABAP的静态代理Spring AOP的动态代理JDK动态代理的优缺点CGLIB动态代理的优缺点ABAP CGLIB的模拟实现ABAP Pre和Post ExitJerry之前一篇文章 SAP产品增强技术回顾,提到基于Java编程语言实现的SAP Commerce,...

weixin_39785723的博客 109

java 切面_浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程的尝试...

文章目录Java的静态代理静态代理的优缺点ABAP的静态代理Spring AOP的动态代理JDK动态代理的优缺点CGLIB动态代理的优缺点ABAP CGLIB的模拟实现ABAP Pre和Post ExitJerry之前一篇文章 SAP产品增强技术回顾,提到基于Java编程语言实现的SAP Commerce,借助Spring框架的支持,能使用面向切面编程的理念(Aspect Orient Progr...

weixin_39861054的博客 179

abap 帮助文档 中文_浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程...

这是Jerry 2020年的第44篇文章,也是汪子熙公众号总共第227篇原创文章。文章目录Java的静态代理静态代理的优缺点ABAP的静态代理Spring AOP的动态代理JDK动态代理的优缺点CGLIB动态代理的优缺点ABAP CGLIB的模拟实现ABAP Pre和Post ExitJerry之前一篇文章 SAP产品增强技术回顾,提到基于Java编程语言实现的SAP Commerce,借助Spr...

weixin_39972151的博客 232

浅谈Java代理模式-----------静态代理和动态代理

  代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法。 本文是对这篇博客(http://www.importnew.com/26116.html)...

Leon_Theprofessional的博客 293

浅谈Spring中JDK动态代理与CGLIB动态代理

代理模式 代理模式:代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的索引,实际执行时通过调用代理类的方法、实际执行的是被代理类的方法。 JDK代理和CGLIB代理差异 实现差异: - cglib的proxy要求代理对象不能被final修饰,因为其原理是继承代理对象生成子类 - jdk的proxy要求代理对象必须实现一个或多个接口...

wangzhihao的博客 1万+

Java之静态代理与动态代理的区别

Java之静态代理与动态代理的区别

码海浮生,一个乐于分享的全栈工程师! 1298

浅谈java动态代理

浅谈java动态代理 文章目录一、前言二、什么是代理模式2.1 什么是代理模式三、java中常用代理模式3.1 静态代理3.2 动态代理3.2.1 jdk动态代理3.2.1.1 jdk动态代理源码分析3.2.1.2 jdk动态代理小结3.2.2 CGLib动态代理三、区别3.1静态代理和动态代理的区别3.2jdk动态代理和CGLib动态代理 一、前言 最近学习一些框架中,发现很多框架用到了动态代...

u012489412的博客 503

浅谈动态代理 与实现原理分析 (附代码)

java动态代理实现与原理详细分析 关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式–代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理。 一、代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的...

6189
上一篇: 对Java中泛型的理解
下一篇: Docker方式搭建Zookeeper集群
ProgrammingWay
博客等级 码龄9年 58粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值