15-基础加强-1-类加载器反射

news2024/11/16 3:34:39

文章目录

    • 1.类加载器
      • 1.1类加载器【理解】
      • 1.2类加载的过程【理解】
      • 1.3类加载的分类【理解】
      • 1.4双亲委派模型【理解】
      • 1.5ClassLoader 中的两个方法【应用】
    • 2.反射
      • 2.1反射的概述【理解】
      • 2.2获取Class类对象的三种方式【应用】 第1步:获取类的Class对象
      • 2.3反射获取构造方法并使用【应用】第2.1步:利用Class类获取对象方法
        • 2.3.1Class类获取构造方法对象的方法
        • 2.3.2Constructor类用于创建对象的方法 (构造方法获取到了,接下来第3步:利用构造方法创建对象了)
        • 2.3.3小结
      • 2.4反射获取成员变量并使用【应用】
        • 2.4.1Class类获取成员变量对象的方法
      • 小结:反射根据配置文件动态创建对象并执行方法

1.类加载器

1.1类加载器【理解】

  • 作用

    负责将.class文件(存储的物理文件)加载在到内存中

在这里插入图片描述

1.2类加载的过程【理解】

  • 类加载时机

    • 创建类的实例(对象)
    • 调用类的类方法
    • 访问类或者接口的类变量,或者为该类变量赋值
    • 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
    • 初始化某个类的子类
    • 直接使用java.exe命令来运行某个主类
  • 类加载过程

    1. 加载

      • 通过包名 + 类名,获取这个类,准备用流进行传输
      • 将这个类加载到内存中
      • 加载完毕创建一个class对象 类在内存中不能随便乱放,得为每个类创建一个Class对象来存放这个类的信息

在这里插入图片描述

  1. 链接

    • 验证

      确保Class文件字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全

      (文件中的信息是否符合虚拟机规范有没有安全隐患)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HzUSJvbX-1676707016232)(.\img\03_类加载过程验证.png)]

    • 准备

      负责为类的类变量(被static修饰的变量)分配内存,并设置默认初始化值

      (初始化静态变量) 静态变量有默认的初始化值 开辟空间 赋值为null 注意只为static修饰的静态变量赋初值

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VrfQ087y-1676707016234)(.\img\04_类加载过程准备.png)]

    • 解析

      将类的二进制数据流中的符号引用替换为直接引用

      (本类中如果用到了其他类,此时就需要找到对应的类)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B12DVgn5-1676707016235)(.\img\05_类加载过程解析.png)]
    在这里插入图片描述

“将类的二进制数据流中的符号引用替换为直接引用”:
加载好了类Student,但是其成员name是引用类型,对应的String类到底有没有被加载呀,加载了在哪呀? 所以String先是符号引用
----内存中找到String类------ 就变成了 直接引用(String类型)

  1. 初始化

    根据程序员通过程序制定的主观计划去初始化类变量和其他资源

    (静态变量赋值以及初始化其他资源)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dxugFrGa-1676707016235)(.\img\06_类加载过程初始化.png)]

  • 小结

    • 当一个类被使用的时候,才会加载到内存
    • 类加载的过程: 加载、验证、准备、解析、初始化

1.3类加载的分类【理解】

  • 分类

    • Bootstrap class loader:虚拟机的内置类加载器,通常表示为null ,并且没有父null
    • Platform class loader:平台类加载器,负责加载JDK中一些特殊的模块
    • System class loader:系统类加载器(应用程序类加载器),负责加载用户类路径上所指定的类库
  • 类加载器的继承关系

    • System的父加载器为Platform
    • Platform的父加载器为Bootstrap

1.4双亲委派模型【理解】

  • 介绍

    如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式

是逻辑上的父子关系,不是extends的继承父子关系。 就是把类加载任务委托给‘父亲’去加载
某个父亲加载不了就返回,直到最后没办法,自己才去加载
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yyyPYrfH-1676709561222)(.\img\07_双亲委派模型.png)]

1.5ClassLoader 中的两个方法【应用】

  • 方法介绍

    方法名说明
    public static ClassLoader getSystemClassLoader()获取系统类加载器
    public InputStream getResourceAsStream(String name)加载某一个资源文件
    public class ClassLoaderDemo1 {
    
        public static void main(String[] args) {
            //获得系统类加载器
            ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
    
            //获得系统类加载器的父加载器 --- 平台类加载器
            ClassLoader platformClassLoader = systemClassLoader.getParent();
    
            //获得平台类加载器的父加载器 --- 启动类加载器
            ClassLoader bootstrapClassLoader = platformClassLoader.getParent();
    
            System.out.println("系统类加载器"+systemClassLoader);
            System.out.println("平台类加载器"+platformClassLoader);
            System.out.println("启动类加载器"+bootstrapClassLoader);
        }
    }
    

    在这里插入图片描述

  • LX 读取properties文件

    • prop.properties
    name=zhangsan
    age=13
    
    • ClassLoaderDemo2.java
    public class ClassLoaderDemo2 {
        public static void main(String[] args) throws IOException {
            //static ClassLoader getSystemClassLoader() 获取系统类加载器
            //InputStream getResourceAsStream(String name)  加载某一个资源文件
    
            //获取系统类加载器
            ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
    
            //利用加载器去加载一个指定的文件
            //参数:文件的路径(放在src的根目录下,默认去那里加载)
            //返回值:字节流。
            InputStream is = systemClassLoader.getResourceAsStream("prop.properties");
    
            Properties prop = new Properties();
            prop.load(is);
    
            System.out.println(prop);
    
            is.close();
        }
    }
    

    在这里插入图片描述

    • ClassLoaderDemo2.java 整理后很简单
    public class ClassLoaderDemo2_1 {
        public static void main(String[] args) throws IOException {
            // 获得系统类加载器
            ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
            // 利用加载器加载一个指定文件 返回字节流
            InputStream is = systemClassLoader.getResourceAsStream("prop.properties");
            Properties prop = new Properties();
            prop.load(is);
            System.out.println("prop = " + prop);
            is.close();
        }
    }
    

2.反射

2.1反射的概述【理解】

  • 反射机制

    是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
    对于任意一个对象,都能够调用它的任意属性和方法;
    这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。

2.2获取Class类对象的三种方式【应用】 第1步:获取类的Class对象

  • 三种方式分类

    • 类名.class属性

    • 对象名.getClass()方法

    • Class.forName(全类名)方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sADuhDGD-1676715280381)(.\img\08_获取Class对象的三种方式.png)]

  • 示例代码
    Student.java

package cn.whu.myreflect1;

public class Student {
    private String name;
    private int age;

    //空参构造,全参构造,toString,所有get/set

    public void study(){
        System.out.println("学生在学习");
    }
}

ReflectDemo1.java

/**
 * 各种获取类的Class对象的方法
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        //方法1.Class类中的静态方法forName("全类名") //所谓全类名: 包名.类名
        Class clazz = Class.forName("cn.whu.myreflect1.Student");
        System.out.println(clazz);//class cn.whu.myreflect1.Student

        //方法2.通过class属性来获取
        Class clazz2 = Student.class;
        System.out.println(clazz2);//class cn.whu.myreflect1.Student

        //方法3.利用对象的getClass方法来获取class对象
        //getClass方法是定义在Object类中的,所以任何对象都有
        Student stu = new Student();
        Class clazz3 = stu.getClass();
        System.out.println(clazz3);//class cn.whu.myreflect1.Student


        System.out.println(clazz == clazz2);//true
        System.out.println(clazz2 == clazz3);//true
    }
}

在这里插入图片描述
无视修饰符: 无视private还是public


有了Class对象可以干嘛,可以获取类的所有信息,主要也就三类:构造器、普通方法、成员变量
Class对象组成如下:
在这里插入图片描述


2.3反射获取构造方法并使用【应用】第2.1步:利用Class类获取对象方法

2.3.1Class类获取构造方法对象的方法

  • 方法介绍

    方法名说明
    Constructor<?>[] getConstructors()返回所有公共构造方法对象的数组
    Constructor<?>[] getDeclaredConstructors()返回所有构造方法对象的数组
    Constructor getConstructor(Class<?>… parameterTypes)返回单个公共构造方法对象
    Constructor getDeclaredConstructor(Class<?>… parameterTypes)返回单个构造方法对象
  • Student.java
package cn.whu.myreflect2;

public class Student {
    private String name;
    private int age;

    //私有的有参构造
    private Student(String name){
        System.out.println("name值为:"+name);
        System.out.println("private Student 有参构造方法");
    }

    //公共无参构造
    public Student() {
        System.out.println("public Student 无参构造方法");
    }

    //公共有参构造
    public Student(String name,int age){
        System.out.println("name值为:"+name+" age值为:"+age);
        System.out.println("public Student 有参构造方法");
    }
}
  • Constructor<?>[] getConstructors() 返回所有公共构造方法对象的数组
    public static void main(String[] args) throws ClassNotFoundException {
        //1.不管那种获取方法 第一步都得先获取Class对象啊
        Class<?> clazz = Class.forName("cn.whu.myreflect2.Student");

        //2. Constructor<?>[] getConstructors()	返回所有公共构造方法对象的数组
        Constructor<?>[] constructors = clazz.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }
    }

在这里插入图片描述

  • Constructor<?>[] getDeclaredConstructors() 返回所有构造方法对象的数组
   public static void main(String[] args) throws ClassNotFoundException {
        //1.不管那种获取方法 第一步都得先获取Class对象啊
        Class<?> clazz = Class.forName("cn.whu.myreflect2.Student");

        //2. Constructor<?>[] getDeclaredConstructors()	返回所有构造方法对象的数组
        Constructor<?>[] declaredAnnotations = clazz.getDeclaredConstructors();
        for (Constructor declaredAnnotation : declaredAnnotations) {
            System.out.println(declaredAnnotation);
        }

在这里插入图片描述

  • Constructor getConstructor(Class<?>… parameterTypes) 返回单个公共构造方法对象
    参数就写构造方法的形式参数类型对应的Class类
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        //1.不管那种获取方法 第一步都得先获取Class对象啊
        Class<?> clazz = Class.forName("cn.whu.myreflect2.Student");
        //2. Constructor getConstructor(Class<?>… parameterTypes)	返回单个公共构造方法对象
        Constructor<?> constructor1 = clazz.getConstructor();
        System.out.println(constructor1);//public cn.whu.myreflect2.Student() 公共空参构造

        Constructor<?> constructor2 = clazz.getConstructor(String.class, int.class);//参数类型就写构造方法的形参类型和顺序
        System.out.println(constructor2);//public cn.whu.myreflect2.Student(java.lang.String,int) //string,int参构造方法
        //Constructor<?> constructor3 = clazz.getConstructor(int.class);//报错 并没有一个参数为(int)的构造方法
    }

在这里插入图片描述

  • Constructor getDeclaredConstructor(Class<?>… parameterTypes) 返回单个构造方法对象
    私有的也可以获取到
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        //1.不管那种获取方法 第一步都得先获取Class对象啊
        Class<?> clazz = Class.forName("cn.whu.myreflect2.Student");
        
        //2. Constructor getDeclaredConstructor(Class<?>… parameterTypes)	返回单个构造方法对象
        // 私有的也可以获取到
        Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(String.class);
        System.out.println(declaredConstructor);
    }

在这里插入图片描述

2.3.2Constructor类用于创建对象的方法 (构造方法获取到了,接下来第3步:利用构造方法创建对象了)

  • 方法介绍

    方法名说明
    T newInstance(Object…initargs)根据指定的构造方法创建对象
    setAccessible(boolean flag)设置为true,表示取消访问检查
  • T newInstance(Object…initargs) 根据指定的构造方法创建对象
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //1. 第一步永远都是先获取Class对象
        Class<?> clazz = Class.forName("cn.whu.myreflect2.Student");
        //2.获取构造方法对象
        Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
        //3.利用newInstance 创建Student对象
        Student student = (Student) constructor.newInstance("张三",23); // 当然创建对象时的实参值得这时候传递了
                                                                                // 此时,构造方法会自动执行
        System.out.println("student = " + student);
    }

在这里插入图片描述
类似的调用空参构造

    public static void main(String[] args) throws Exception {
        //1. 第一步永远都是先获取Class对象
        Class<?> clazz = Class.forName("cn.whu.myreflect2.Student");
        //2.获取构造方法对象
        Constructor<?> constructor = clazz.getConstructor();
        //3.利用newInstance 创建Student对象
        Student student = (Student) constructor.newInstance(); // 当然创建对象时的实参值得这时候传递了
        														// 此时,构造方法会自动执行
        System.out.println("student = " + student);
    }

在这里插入图片描述
空参构造还有个简写方式(过时方法 了解即可)

    public static void main(String[] args) throws Exception {        
        // 反射调用空参创建对象简写格式
        //1. 第一步永远都是先获取Class对象
        Class<?> clazz = Class.forName("cn.whu.myreflect2.Student");
        //2. 在Class类中,有一个newInstance方法,可以利用空参直接创建一个对象 (直接跳过了获得构造对象那一步)
        Student student = (Student) clazz.newInstance(); // 该方法已经过时 了解即可
        
        System.out.println(student);
    }

在这里插入图片描述

  • setAccessible(boolean flag) 设置为true,表示取消访问检查(可以临时使用私有成员了)

★获取一个私有的构造方法,创建对象★
多一步,临时取消访问检查

	public static void main(String[] args) throws Exception {
        //1. 第一步永远都是先获取Class对象
        Class<?> clazz = Class.forName("cn.whu.myreflect2.Student");
        //2.获取构造私有方法对象
        Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);

        //直接创建对象会报错 毕竟私有,直接调用私有构造方法肯定不妥
        //也即:被private修饰的成员,不能直接使用
        //如果用反射强行获取并使用,需要临时取消访问检查
        constructor.setAccessible(true);//临时取消(私有)访问检查

        //3.利用newInstance 创建Student对象
        Student student = (Student) constructor.newInstance("张三"); // 当然创建对象时的实参值得这时候传递了
        															// 此时,构造方法会自动执行
        
        System.out.println("student = " + student);
    }

在这里插入图片描述
反射可以强行获取私有方法,并强行用其获取对象

2.3.3小结

  • 获取class对象

    三种方式: Class.forName(“全类名”), 类名.class, 对象名.getClass()

  • 获取里面的构造方法对象

    getConstructor (Class<?>... parameterTypes) getDeclaredConstructor (Class<?>… parameterTypes)

  • 如果是public的,直接创建对象

    newInstance(Object… initargs)

  • 如果是非public的,需要临时取消检查,然后再创建对象

    setAccessible(boolean) 暴力反射
    在这里插入图片描述

2.4反射获取成员变量并使用【应用】

2.4.1Class类获取成员变量对象的方法

  • 方法分类

    方法名说明
    Field[] getFields()返回所有公共成员变量对象的数组
    Field[] getDeclaredFields()返回所有成员变量对象的数组
    Field getField(String name)返回单个公共成员变量对象
    Field getDeclaredField(String name)返回单个成员变量对象

公共成员变量:仅仅public修饰的成员变量
所有成员变量:public、private、protect… 修饰的成员变量

小结:反射根据配置文件动态创建对象并执行方法

小结:
1、获取Class对象
Class clazz = Class.forName("cn.whu.myreflect1.Student");
Class clazz2 = Student.class;
Class clazz3 = new Student().getClass();

2、通过Class对象获取三类成员
Constructor constructor = clazz.getConstructor(); // 获取构造器
Method method = clazz.getMethod("name"); //获取方法
Field field clazz.getField(String name) # 获取变量名

3、通过获取的构造器创建对象
Object o = constructor.newInstance();

4、通过对象和方法,执行对应方法
method.invoke(o);//学生在学习

反射可以根据配置文件,动态创建对象,并调用对象的方法
在这里插入图片描述

ReflectDemo2.java

package cn.whu.myreflect1;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * 根据配置文件创建对象,并执行对象方法
 */
public class ReflectDemo2 {
    public static void main(String[] args) throws ClassNotFoundException, IOException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException {
        //获取系统类加载器,加载prop.properties文件
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("prop.properties");
        //得先创建一个Properties集合
        Properties prop = new Properties();
        //将文件中的数据读取到集合中
        prop.load(is);
        is.close();

        //---- 下面利用【反射】创建对象并调用方法 ----
        // 死步骤 能看懂 最好是记住

        //获取字节码文件对象
        Class clazz = Class.forName(prop.getProperty("className"));//配置文件里className配置好的全路径名
        //(通过类Class对象)获取构造器对象
        Constructor constructor = clazz.getConstructor();
        //利用构造器创建一个对象
        Object o = constructor.newInstance();
        //获取方法对象
        Method method = clazz.getMethod(prop.getProperty("methodName"));//配置文件里配置好的方法名
        //运行方法
        method.invoke(o);//学生在学习
    }
}

prop.properties

className=cn.whu.myreflect1.Worker
methodName=work

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/355114.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【FiddlerScript】利用Fiddler中的FiddlerScript解除4399小游戏的防沉迷

本文仅供技术探讨&#xff0c;切勿用于非法用途案例网站:小游戏,4399小游戏,小游戏大全,双人小游戏大全 - www.4399.com准备的工具:配置好的Fiddler一个Fiddler官方英文版配置教程:https://www.bilibili.com/video/BV1rP4y1t7ZLFiddler中文版配重教程:https://www.bilibili.com…

懒加载以及预加载相关概念

⼆、懒加载 1. 懒加载的概念 懒加载也叫做延迟加载、按需加载&#xff0c;指的是在⻓⽹⻚中延迟加载图⽚数据&#xff0c;是⼀种较好的⽹⻚性能优化 的⽅式。 在⽐较⻓的⽹⻚或应⽤中&#xff0c;如果图⽚很多&#xff0c;所有的图⽚都被加载出来&#xff0c;⽽⽤户只能看到…

创建vue项目

前提安装node.js 安装vue脚手架 命令: npm install -g vue/cli 安装完成后查看下版本 vue --version 开始创建vue项目,可以用cmd终端也可以用pow(Windows PowerShell) 搜索输入pow以管理员运行 找一个项目存放位置 pow进入该目录 创建项目命令 如果创建项目时候报错 输入…

解读|奔驰财报展现强大现金实力,2年内回购价值40亿欧元股票

2月17日&#xff0c;梅赛德斯-奔驰集团股份公司&#xff08;股票代码&#xff1a;MBG&#xff09;发布了拆分后的第一个财年业绩报告&#xff0c;2022年&#xff0c;该集团实现营业总收入1500.17亿欧元&#xff0c;同比上年增长35%&#xff1b;实现税前利润为204.58亿欧元&…

【基础】Flink -- ProcessFunction

Flink -- ProcessFunction处理函数概述处理函数基本处理函数 ProcessFunction按键分区处理函数 KeyedProcessFunction定时器与定时服务基于处理时间的分区处理函数基于事件时间的分区处理函数窗口处理函数 ProcessWindowFunction应用案例 -- Top N处理函数概述 为了使代码拥有…

基于Springbot+微信小程序的购药平台的设计与实现

基于Springbot微信小程序的购药平台的设计与实现 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、…

Jackson 序列化:Cannot deserialize value of type `java.time.LocalDateTime`

问题描述 使用 jackson 反序列化异常如下&#xff1a; Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type java.time.LocalDateTime from String “2023-02-13 19:43:01”: Failed to deserialize java.time.LocalDat…

MySQL的四种事务隔离级别

目录一、事务的基本要素&#xff08;ACID&#xff09;1、原子性&#xff08;Atomicity&#xff09;&#xff1a;2、一致性&#xff08;Consistency&#xff09;&#xff1a;3、隔离性&#xff08;Isolation&#xff09;&#xff1a;4、持久性&#xff08;Durability&#xff09…

使用canvas给上传的整张图片添加平铺的水印

写在开头 哈喽&#xff0c;各位倔友们又见面了&#xff0c;本章我们继续来分享一个实用小技巧&#xff0c;给图片加水印功能&#xff0c;水印功能的目的是为了保护网站或作者版权&#xff0c;防止内容被别人利用或白嫖。 但是网络中&#xff0c;是没有绝对安全的&#xff0c;…

iOS接入Google登录

1.在Google Cloud后台配置客户端ID 首先要在 Google Cloud 中创建一个项目。新创建的Project需要先配置同意屏幕。一共有4步骤需要配置。 1.OAuth 同意屏幕 User Type选择"外部"进行创建。填写必必要的信息&#xff0c;应用名称、用户支持电子邮件地址、开发者电子邮…

chatGPT是什么?chatGPT运用场景有哪些?

大家好&#xff0c;小编来为大家解答以下问题 chatGPT是什么&#xff1f;&#xff0c;chatGPT概念股有哪些&#xff1f;一个有趣的事情&#xff0c;一个有趣的事情&#xff0c;现在让我们一起来看看吧&#xff01; 1、chatpgt是什么 ChatGPT是OpenAI开发的大型预训练语言模型。…

yolov5 onnx 前后处理+运行推理(暂记)

代码在这个基础上改的&#xff0c;虽然跑通了&#xff0c;还是很混乱&#xff0c;这里先简单记录一下处理的流程&#xff1a; yolov5 环境设置yolov5 网络结构ONNX yolov5导出 convert error --grid番外&#xff1a;onnx直接操作番外&#xff1a;yolov5的重新训练 result 0 -…

[安装之4] 联想ThinkPad 加装固态硬盘教程

方案&#xff1a;保留原有的机械硬盘&#xff0c;再加装一个固态硬盘作为系统盘。由于X250没有光驱&#xff0c;这样就无法使用第二个2.5寸的硬盘。还好&#xff0c;X250留有一个M.2接口&#xff0c;这样&#xff0c;就可以使用NGFF M.2接口的固态硬盘。不过&#xff0c;这种接…

短视频时代是靠什么赚钱的,介绍常见的5种方式,简单明了

目前&#xff0c;短视频越来越火热&#xff0c;大家都知道做短视频可以赚钱&#xff0c;那么究竟是靠什么赚钱的&#xff0c;又有几个人知道呢&#xff1f;短视频创业有个人、有团队&#xff0c;怎么实现团队的生存和发展。 常见的几种变现方式有&#xff1a; 1、平台分成 各…

C语言中用rand()函数产生一随机数

在C语言中如何产生一个随机数呢&#xff1f;用rand()函数。 rand()函数在头文件&#xff1a;#include <stdio.h>中&#xff0c;函数原型&#xff1a;int rand(void);。rand()会返回一个范围在0到RAND_MAX&#xff08;32767&#xff09;之间的随机数&#xff08;整数&…

Pytorch 基础之张量数据类型

学习之前&#xff1a;先了解 Tensor&#xff08;张量&#xff09; 官方文档的解释是&#xff1a; 张量如同数组和矩阵一样, 是一种特殊的数据结构。在PyTorch中, 神经网络的输入、输出以及网络的参数等数据, 都是使用张量来进行描述。 说白了就是一种数据结构 基本数据类型…

Python可以解码吗,解码打码是如何实现的

前言 咳咳&#xff0c;进来的铁汁都是抱着学习的心态进来看的吧&#xff0c;咱今天不讲解解码&#xff0c;咱来说说python如何来实现打码功能~ 这一个个进来的 都是标题党吧哈哈哈 有兴趣的可以继续看看哦 最近重温了一档综艺节目 至于叫什么 这里就不细说了 老是看着看着就…

【QT 5 相关实验-示波器-学习笔记-示波器组件练习与使用总结】

【QT 5 相关实验-示波器-学习笔记-示波器组件练习与使用总结】1、概述2、实验环境3、参考资料-致谢4、自我提升实验效果视频演示5、代码练习-学习后拆解-实验步骤&#xff08;1&#xff09;头文件部分-"mwaveview.h"&#xff08;2&#xff09;cpp文件部分-"mwav…

UDP数据报套接字编程

DatagramSocket API DatagramSocket 是UDP Socket&#xff0c;用于发送和接收UDP数据报。 DatagramSocket 构造方法&#xff1a; DatagramSocket 方法&#xff1a; DatagramPacket API DatagramPacket是UDP Socket发送和接收的数据报。 DatagramPacket 构造方法&#xff…

本地生成动漫风格 AI 绘画 图像|Stable Diffusion WebUI 的安装和局域网部署教程

Stable Diffusion WebUI 的安装和部署教程1. 简介2. 安装环境2.1 Windows2.2 Linux3. 运行4. 模型下载链接5. 局域网部署5.1 Windows5.2 Linux6. 其他资源1. 简介 先放一张WebUI的图片生成效果图&#xff0c;以给大家学习的动力 &#xff1a;&#xff09; 怎么样&#xff0c;…