那些你不知道的“反射”技术

Java反射技术是什么 Java反射技术是什么 Java反射技术是指在运行时动态获取类的信息,并对类进行操作的一种技术。Java反射技术可以让程序在运行时动态地创建对象、调用方法、获取属性等,使程序更加灵活、扩展性更强。 阅读详情

一. 反射概念

我们知道,在物理层面上,反射是一种光学现象,是指光在传播到不同物质时,在分界面上改变传播方向后又返回原来物质中的现象。

而在Java中,反射是一种机制,而不是一种现象。反射机制指的是程序在运行时能够动态获取类对象的属性,和调用类对象的方法。

Java中的编译类型有两种 :

  • 静态编译 :在编译时确定类型,绑定对象即通过。

  • 动态编译 :运行时确定类型,绑定对象。动态编译最大限度地发挥了Java的灵活性,体现了多态的应用,可以减低类之间的耦合性。

使用反射可以赋予 JVM 动态编译的能力,否则类的元数据信息只能用静态编译的方式实现。

二. 反射API

在Java中,JDK为我们提供了一些反射相关的API,如下表所示:

接下来我们就来看看反射到底怎么用。

三. 具体使用

1. 常规实现

我们知道,在Java中的实体类总会有一些固定的方法,比如每个属性的 get()、set()方法,还有初始化属性创建对象的构造方法,打印对象信息的toString()等方法。假如我们在没有使用注解的情况下,需要创建2个普通的实体类:Cat、Dog,代码如下所示:

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">public class Cat {
    private String name;
    private int age;

    public Cat() {
    }

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">public class Dog{
    private String name;
    private int age;

    public Dog() {
    }
    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

我们想在案例代码中 创建对象 并打印 对象信息 ,如下所示:

<pre class="prettyprint hljs cs" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">public class Demo01 {
    public static void main(String[] args){
        Cat cat = new Cat("招财", 1);
        System.out.println(cat.toString());

        Dog dog = new Dog("旺财",2);
        System.out.println(dog.toString());
    }
}

在上面这两个实体类中,都存在着名字相同、但方法体不同的toString()方法。如果我们在实体类中不重写toString() ,直接通过对象调用 toString(),打印的结果不会是对象的信息。

我们可以使用 反射 给两个实体类,甚至更多的实体类自动加上toString()方法,从而达到减少代码量的目的。

2. 反射实现

2.1 创建父类BaseEntity

首先我们创建一个父类BaseEntity

<pre class="prettyprint hljs gradle" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">public class BaseEntity {
    @Override
    public String toString() {
        //1.获取反射对象
        Class<? extends BaseEntity> clazz = this.getClass();
        //2.创建 StringBuffer 对象拼接字符串
        StringBuffer sb = new StringBuffer();
        //3.通过 getSimpleName() 获取类名并拼接
        sb.append(clazz.getSimpleName());
        //拼接大括号
        sb.append("{");
        //4.获取所有成员变量对象
        Field[] fields = clazz.getDeclaredFields();
        Object value = null;
        for (int i = 0; i < fields.length; i++) {
            //5.获取成员变量对象
            Field field = fields[i];
            //6.打开访问权限
            field.setAccessible(true);
            //7.通过 getName() 获取属性名并拼接
            sb.append(getName());
            sb.append("=");
            //8.通过 get() 传递 this 获取对象的属性值
            try {
                value = field.get(this);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            //9.判断是否为 String 类型的属性,是则添加单引号
            if(field.getType() == String.class){
                sb.append("'");
                sb.append(value);
                sb.append("'");
            }else{
                sb.append(value);
            }
            //10.判断是否为最后一个属性对象
            if(i == fields.length-1){
                sb.append("}");
            }else{
                sb.append(", ");
            }
        }
        //11.通过 toString() 转换成字符串并返回
        return sb.toString();
    }
}

2.2 继承父类

然后将两个实体类 Cat 和 Dog,都继承 BaseEntity且不重写 toString()方法。

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">public class Cat extends BaseEntity{
    private String name;
    private int age;

    public Cat() {
    }

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">public class Dog extends BaseEntity{
    private String name;
    private int age;

    public Dog() {
    }
    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

2.3 运行测试

接下来在案例类中 创建对象 并打印 对象信息, 这里 会发现打印结果不再是之前没有 toString() 的情况,而是会分别打印出各自对象的信息。

<pre class="prettyprint hljs cs" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">public class Demo01 {
    public static void main(String[] args){
        Cat cat = new Cat("招财", 1);
        System.out.println(cat.toString());

        Dog dog = new Dog("旺财",2);
        System.out.println(dog.toString());
    }
}

我们可以在以上案例中发现,toString()方法在运行状态时,通过反射获取了运行对象的类属性,进行了信息的拼接,从而达到了减少实体类代码量的目的,提高了代码的复用性。

四. 小结

使用反射技术,可以让我们进行动态的创建对象和编译,体现出很高的代码灵活性。但反射技术却对性能有一定的影响,它不如静态创建对象那样来得直接高效。所以反射既有好处也有缺点,但好处远大于缺点。给大家展现了反射技术强大功能的冰山一角,它还有更多的神奇之处有待于我们继续挖掘。

“易语言.飞扬”类型反射机制与反射类库 我们在不同的场合用不同的方式阐述过,“易语言.飞扬”具有非常完善的类型反射机制。看一下反射类库(反射.ncl)提供了哪些功能,就大致可以了解“易语言.飞扬”的类型反射机制。强调一点:是因为有了完善的类型反射机制,才会产生反射类库;而不是因为反射类库的存在,才使“易语言.飞扬”有了完善的类型反射机制。反射类库是结果之一,是表现形式之一。 反射类库主要提供两大方面的功能:1、获取指定类 阅读详情

相关推荐

比反射更强大的技术,内省技术

在学习Java过程中,总是层层递进的。差不多从数据类型到IO、异常就算基础部分(不同书不一样)。之后就是Java的进阶,一般我们都会学到泛型、反射之类的。今天要说的东西,就和反射有关系,叫做“内省技术”。“内省技术”是基于反射技术的,提供了更多的便于操作JavaBean的API。一般的话,我们只有学到JavaWeb才会称呼JavaBean,由此可知“内省技术”属于JavaWeb的内容(搞笑逻辑,别...

ZackSock的博客 3187

反射技术(架构师必备)

一、什么是反射? 先了解一下什么是类?什么是对象? 在现实生活中先存在具体的对象,然后很多对象之间存在对象相似的特征和行为,人们为了描述方便,将具有很多相似特征和行为的对象抽取成类。也就是说类用来描述对象,将对象的的行为和特征都描述出来。 反射则是用来描述类的,在描述类的时候,细分多层:类本身(Flass),类的属性(Field、)、类中的方法(Method)、类的构造方法(Constructor)、类所在的包(Package)重点。 图解反射与类之间的关系二、反射如何描述类 Class:用

因为热爱,所以坚持,记录工作中的乐趣 675

超详细neo4j安装教程

一、neo4j简介 最近开始学习知识图谱,所以首先想先学习一下neo4j的使用。 Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。由于知识图谱中存在大量的关系型信息(实体—关系—实体), 使用结构化数据库进行存储将产生大量的冗余存储信息, 因此将图数据库作为知识图谱的存储容器成为流行的选择。当前较为常用的图数据库主要有 Neo4j 等。 二、neo4j的安装 功能快捷键 撤销:Ctrl/Command + Z 重做:Ctrl/Command + Y 加粗:Ctrl/Co

qq_38335648的博客 9万+

14--反射技术

1、反射技术 1.1、介绍反射 Java中的反射:它是使用非常规的手段获取某个class文件中的内容(成员变量、构造函数、普通函数等)。不使用new关键字创建对象,而是通分析过class文件中的内容,获取到类的对象,进而可以让类中的函数运行。 所有的框架(Struts2、hibernate、spring、springMVC、mybatis、springboot等)它们的底层全部在使用反射技术...

QB哥欢迎您 660

秋叶ComfyUI-v10中文整合包:全中文AI绘画一键部署与实战指南

Stable Diffusion作为当前主流的扩散模型,通过去噪过程从随机噪声生成高质量图像,其开源特性推动了AI绘画技术的普及。然而,其官方WebUI在自定义工作流和可复现性上存在局限,而基于节点流程的ComfyUI则提供了更高的自由度和工程化控制能力,尤其适合复杂、可重复的创作流程。对于中文用户而言,英文界面和提示词输入是主要障碍。秋叶出品的ComfyUI-v10中文整合包,正是针对这一痛点,提供了**全中文界面**和**原生中文提示词支持**的解决方案。该整合包将Python环境、依赖库及常用插件预配

weixin_33895475的博客 398

【UE5_蓝图】实时音频采集与动态WAV文件保存实战指南

本文详细介绍了在UE5中使用蓝图实现实时音频采集与动态WAV文件保存的完整流程。从插件配置、录音框架搭建到动态文件名生成和音频参数优化,提供了实用技巧和常见问题解决方案,特别适合需要快速实现音频采集功能的开发者。

weixin_29009669的博客 407

反射技术

1.反射机制介绍_Class对象获取 1.1反射机制是Java的动态性之一 动态语言: 在程序运行时,可以改变程序的结构或变量的类型 举例:JavaScript &lt;html&gt; &lt;head&gt; &lt;title&gt;js代码&lt;/title&gt; &lt;script&gt; function test(){ var s="var a=3;va...

qq_33193871的博客 299

STM32H5 USB虚拟串口:用Classic驱动移植CDC实践

USB虚拟串口(CDC)是嵌入式系统最常用的主机通信方式之一,本质是借助USB协议模拟串口收发,无需额外驱动即可在PC上生成COM口。其实现依赖USB设备协议栈完成枚举、控制传输与批量传输。传统USBD Classic库不依赖RTOS,代码轻量、调用链短,非常适合裸机或轻量状态机架构;而USBX功能强大但需要ThreadX内核,资源开销较大。在电机控制器、传感器采集等场景中,日志输出与参数配置仅需简单的双向数据通道,Classic驱动往往更务实。本文基于STM32H5平台,详细梳理了使用Classic驱动移

weixin_29178069的博客 333

反射详解&使用场景

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.以上的总结就是什么是反射反射就是把java类中的各种成分映射成一个个的Java对象。

qq_43842093的博客 4021

STM32H750xx【QSPI】轮询方式读写GD25Q64E

本文详细介绍了GD25Q64E其特性、引脚定义及功能说明,重点阐述了在STM32H750平台上通过CubeMX配置QuadSPI接口的步骤,包括时钟设置、参数优化等。文章提供了完整的BSP驱动开发流程,涵盖写使能、四线模式使能、ID读取、解除保护、扇区擦除、整片擦除、页编程和数据读取等关键功能实现,并通过读写测试验证了DummyCycles参数对数据准确性的影响。

honmy18的博客 1421

树莓派5新手必看:保姆级ibus中文输入法安装与配置全流程(含.bashrc设置避坑)

本文详细介绍了在树莓派5上安装和配置ibus中文输入法的完整流程,包括系统环境准备、ibus框架安装、图形界面配置及常见问题解决方案。通过清晰的步骤说明和避坑指南,帮助新手快速实现中文输入功能,提升开发效率。

weixin_29159441的博客 524

关于Java你不知道的那些事之Java注解和反射

Java注解和反射前言什么是注解内置注解元注解自定义注解反射机制动态语言与静态语言动态语言静态语言Java反射机制概述什么是反射反射的应用Java反射的优缺点反射相关的主要API理解Class类并获取Class实例Class类Class类常用的方法获取对象实例的方法哪些类型可以有Class对象Java内存分析类的加载与ClassLoader的理解类加载过程类加载步骤什么时候发生类初始化类的主动引用(一定发生初始化)类的被动引用(不会发生初始化)类加载器的作用获取运行时候类的完整结构双亲委派机制有了Class

轻狂书生FS的博客 4032

使用电荷放大器处理压电加速度计输出

电阻器 R p模拟传感器的绝缘电阻,为产生的电荷创建泄漏路径。在此图中,顶部波形显示传感器产生的电荷,而底部波形显示电荷放大器的输出。这需要具有大输入阻抗的放大级,以防止产生的电荷通过与传感元件并联的放大器的输入阻抗泄漏。换句话说,电荷放大器补偿传感器产生的电荷 q p ,反馈电容器 C F中具有相反极性的等量电荷。因此,任何与传感器并联的绝缘电阻,如电缆的绝缘电阻或传感器的漏电电阻Rp,都不能流过电流。漂移是指电荷放大器输出在一段时间内发生的变化,而不是由被测物理参数的变化(我们讨论的加速度)引起的。

weixin_45260069的博客 3900

【Java 基础】带你深入学习“反射”技术

带你深入学习“反射”技术

激流丶的博客 2497

关于瑞芯微SDK中buildroot的架构分析、配置细节、以及一些使用步骤

摘要:瑞芯微SDK基于Buildroot框架,针对RK3568等芯片提供定制化开发环境。核心目录包括buildroot(配置与编译框架)、kernel(定制内核)和u-boot(引导程序)。开发流程为:1)加载芯片默认配置;2)通过menuconfig定制系统(架构、内核、软件包等);3)可选修改内核配置。关键硬件适配需修改设备树(dts)和分区表(parameter.txt),系统行为通过启动脚本(S90network)调整。最终执行make编译生成可烧录固件。该框架通过配置文件驱动,实现从工具链构建到固

Hyjks的博客 1199

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【数据结构】反射,枚举你必须知道的相关知识

本期讲解了关于反射,枚举的相关使用方法,并且附加代码实现讲解,最后通过源码解析总结了反射和枚举之间的关系。

GGBond778的博客 1757

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++反射技术的本质

C++反射技术的本质,就是把类的结构信息(字段、方法等)以某种方式保存下来(手动登记、代码生成、或未来编译器自动生成),让程序能动态地查找和操作这些信息。方法体本身还是C++代码,反射系统只是能找到并调用它。C++反射的本质:让程序能“认识自己”,动态查找和操作类的结构。实现方式:手动登记(宏/模板)、代码生成、未来标准反射。方法体调用:保存方法入口,运行时查找并调用。代码生成:自动生成反射信息和辅助代码,和你写的类一起编译。标准反射:未来C++会原生支持,彻底解放双手。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1235

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

老司机带带你,教你学会Java中又骚又暴力的“反射”技术

在Java中有这么一个很骚的技术,几乎贯穿了所有主流的框架,在所有主流框架的底层中你都可以看见它的身影,这个技术就是。今天就来教教你如何理解和使用Java的反射。

一一哥 1794

阻抗不匹配时,为何产生反射

<br />阻抗你可以理解成连接水管,阻抗大小你理解成水管直径的大小,最好是找到合适大小的水管(阻抗匹配) 引用回复鲜花 ( 0) 臭鸡蛋 ( 0) 电子工程专辑:以材料技术为核心,TDK持续发力中国汽车市场第2楼回复主题:阻抗不匹配时,为何产生反射?发布时间:2007-5-10 下午1:21 <br /><br />作者: desire<br />等级: 初入江湖<br />积分: 171分<br />发帖数: 33次<br />网站总积分: 174分<br />发送消息<br />加为好友<br />查

lh1611的专栏 9596

抽象工厂之“反射”技术

在七层中最重要的一个闪光点就是使用了“反射”技术,下面来说一下我自己的理解。 在说反射前,先说一下“键值对”。在机房收费系统的配置文件中有一段这样的代码: 这里面的每一个“key”都对应着一个相应的值“value”,key与value做到一一对应。这样根据key,就可以得到与其对应的值了。 在反射工厂中以登录功能为例,看它是如何运用的:

李春丽的博客 623

一文搞懂java中的高大上技术“反射”

反射的概念 ​ JAVA反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性; java中应用的几个场景: Spring 框架中bean的初始化用到了反射 破坏单例模式是我们也用到了反射 获取标注的注解的类时也用到了反射 JDBC连接数据 反射的基本使用 Java 反射的主要组成部分有4个: Class:任何运行在内存中的所有类都是该 Class 类的实例对象,每个 Class 类对象内部都包含了本来的所有信息。记着一句话,通过反射干任

weixin_40300139的博客 9105

JAVA中的反射技术

之前的学习一直都没有文字记录,发现过一段时间之后某些知识点就会遗忘,所以今后所学习的知识点将记录下来,以便以后用来复习。 这次来说说JAVA中的反射技术,说起反射技术我对于它一直以来都是一种懵逼的状态,有一种非常排斥它的心理。在实际中JAVA的反射机制非常重要,我们使用的许多的开发框架都是基于反射实现的。如果不能很好的理解学习反射技术将会对今后的学习或技术提升将是一个非常大的阻碍。 什么是反射? ...

zbj17602900546的博客 1448

反射需要知道的东西

目录Java反射机制概述Java Reflection补充:动态语言 vs 静态语言Java反射机制研究及应用反射相关的主要API理解Class类并获取Class实例Class 类Class类的常用方法获取Class类的实例(四种方法)哪些类型可以有Class对象?类的加载与ClassLoader的理解了解:类的加载过程了解:什么时候会发生类初始化?了解:ClassLoader创建运行时类的对象有...

希冀 671

手写MyBatis第6弹:没有反射就没有MyBatis,反射技术如何驱动ORM框架运行

摘要:本文深度剖析反射技术在MyBatis框架中的核心应用,揭示其如何支撑ORM框架的动态特性。文章首先解析反射API"四剑客"(Class、Method、Field、Annotation)在MyBatis中的具体应用场景,随后通过UserMapper实例演示反射获取SQL注解、方法返回类型等关键操作流程。重点剖析反射在MyBatis配置解析、动态代理(MapperProxy)和结果集映射三大核心环节的底层实现,并对比分析无反射情况下的框架局限性。文末提供性能优化方案及往期源码资源,完整

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 1087

java反射技术强制类型转换_「编程」 Java核心技术:反射

所有的技术实现的目标只有一点:重用性java.lang.Objectpublic final Class> getClass(); 根据实例化对象找到对象的所属类型java.lang.Classpublic final class ClassgetName():String:获得该类型的全称名称。getSuperClass():Class:获得该类型的直接父类,如果该类型没有直接父类,那么返...

weixin_39589557的博客 2473

什么是反射技术?

反射1、什么是反射技术?2、获取class对象的三种方式3.通过方式三:(此外还可以使用构造,构造可以指定参数---如String.class) 1、什么是反射技术? 动态获取指定类以及类中的内容(成员),并运行其内容。 应用程序已经运行,无法在其中进行new对象的建立,就无法使用对象。这时可以根据配置文件的类全名去找对应的字节码文件,并加载进内存,并创建该类对象实例。这就需要使用反射技术完成 2...

qq_40472328的博客 715
上一篇: Java深拷贝和浅拷贝,Cloneable接口
下一篇: 你知道处理Spring 九大事务失效场景吗?
Java_ttcd
博客等级 码龄4年 198粉丝 190原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值