进阶篇-Day17:JAVA的日志、枚举、类加载器、反射等介绍】

news2025/2/28 15:48:07

目录

  • 1、日志
    • 1.1 日志概念
    • 1.2 日志框架
      • (1) Logback框架:
      • (2)配置文件介绍:
  • 2、枚举
  • 3、类加载器
    • 3.1 类加载器的介绍
    • 3.2 类加载器的加载过程:加载、链接、初始化
    • 3.3 类加载器的分类
    • 3.4 双亲委派模式
    • 3.4 ClassLoaser的常用成员方法
  • 4、反射
    • 4.1 反射概念
    • 4.2 反射的使用
      • 4.2.1 获取类的字节码对象:
      • 4.2.2 反射类中的构造方法
      • 4.2.3 反射类中的成员变量
      • 4.2.4 反射类中的成员方法
      • 4.2.5 案例:
        • (1)
        • (2)

1、日志

1.1 日志概念

在这里插入图片描述

前面我们其实已经在记录日志,如下所示,通过将信息打印到控制台来查看程序运行到哪里了。
在这里插入图片描述

接下来学习日志框架来记录日志。

1.2 日志框架

在这里插入图片描述

(1) Logback框架:

在这里插入图片描述

1、引入三个jar包:
在这里插入图片描述
在这里插入图片描述
这里有教程下载:https://www.cnblogs.com/yumengqifei/p/16407919.html

2、导入配置文件
在这里插入图片描述

3、获取日志对象使用:

package com.itheima.log;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogTest {
    public static void main(String[] args) {
        //获取日志对象
        Logger logger = LoggerFactory.getLogger("LogTest.class");
        logger.info("记录了一条日志");
    }
}

运行结果:
在这里插入图片描述

(2)配置文件介绍:

在这里插入图片描述

下面是logback.xml的样例(可复制后自己改),以及说明:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <!-- 控制台应用器:表示当前的日志信息是可以输出到控制台的 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 输出流对象,默认System.out,也可使用System.err -->
        <!-- 输出流对象,默认System.out,也可使用System.err -->
        <target>System.err</target>
        <!-- 格式化输出:
                  %d:表示日期
                  %thread:表示线程名
                  %-5level:表示级别从左显示5个字符宽度
                  %c:表示获取日志时传入的字符串
                  %msg:表示日志消息
                  %n:是换行符
        -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c [%thread]: %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 文件应用器:输出的方向通向文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 日志输出路径 -->
        <file>logs/myapp.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 指定日志文件拆分和压缩规则 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 通过指定压缩文件名称,来确定分割文件方式 -->
            <fileNamePattern>logs/myapp.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 文件拆分大小 -->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <!--
      日志级别:
          level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL, OFF。默认debug
          <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
     -->
    <root level="all">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>

</configuration>

在这里插入图片描述

2、枚举

在这里插入图片描述
在这里插入图片描述

直接看一个例子:

package com.itheima.my_enum;

public class Enum_Test {
    /**
     * 枚举介绍:Java中一种特殊的类型,常用于信息的标记和分类,和常量相比,有如下特点:
     *         1、常量
     *         2、枚举:入参严谨、提示性更强、代码优雅
     */
    public static void main(String[] args) {
        method(Season.SUMMER);//注意:入参是枚举类Season的对象
        System.out.println(Season.SPRING.getCode());//1
        System.out.println(Season.SPRING.getName());//春天
        System.out.println(Season.SPRING.getDesc());//我是春天
    }

    private static void method(Season season) {
        switch (season){
            case SPRING:
                System.out.println("春天");
                break;
            case SUMMER:
                System.out.println("夏天");
                break;
            case AUTUMN:
                System.out.println("秋天");
                break;
            case WINTER:
                System.out.println("冬天");
                break;
        }
    }
}

enum Season{
    //枚举项:枚举类的对象
    SPRING("1", "春天", "我是春天"),
    SUMMER("2", "夏天", "我是夏天"),
    AUTUMN("3", "秋天", "我是秋天"),
    WINTER("4", "冬天", "我是冬天");

    private final String code;
    private final String name;
    private final String desc;

    //枚举类的带参构造方法,则枚举类的对象入参必须要写
    private Season(String code, String name, String desc){
        this.code = code;
        this.name = name;
        this.desc = desc;
    }

    public String getCode() {
        return code;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3、类加载器

3.1 类加载器的介绍

在这里插入图片描述
在这里插入图片描述

3.2 类加载器的加载过程:加载、链接、初始化

在这里插入图片描述
在这里插入图片描述

上述的解析需要解释一下,如果一个类只是被加载到方法区,那么这个类里的其他类只是一个符号,并没有创建地址,只有当这个类被创建了之后,这个类里的其他类才会分配地址,也就是上述说的:将常量池中的符号引用解析为直接引用
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.3 类加载器的分类

在这里插入图片描述

package com.itheima.classloader;
import sun.net.spi.nameservice.dns.DNSNameService;
public class ClassLoaderTest {
    /**
     * 各自类加载器的职责
     */
    public static void main(String[] args) {
        //1、加载JDK自带的类 BootStrap ClassLoader (启动类加载器)
        ClassLoader classLoader1 = String.class.getClassLoader();
        System.out.println(classLoader1);

        //2、Platform ClassLoader (平台类加载器)  jdk8的话,获取的是jre\lib\ext\   jdk9及之后的话  lib\modules
        ClassLoader classLoader2 = DNSNameService.class.getClassLoader();
        System.out.println(classLoader2);

        //3、Application ClassLoader (系统类加载器) 加载自己编写的类
        ClassLoader classLoader3 = ClassLoaderTest.class.getClassLoader();
        System.out.println(classLoader3);//sun.misc.Launcher$AppClassLoader@18b4aac2

        //4、测试类加载器的上下级关系
        System.out.println(classLoader3.getParent());//获取他的上级
        System.out.println(classLoader3.getParent().getParent());//获取他上级的上级
    }
}

3.4 双亲委派模式

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.4 ClassLoaser的常用成员方法

在这里插入图片描述

package com.itheima.classloader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ClassLoaderMethod {
    public static void main(String[] args) throws IOException {
        //获取系统类加载器 Application Class Loader
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        System.out.println(systemClassLoader);

        //通过系统类加载器,加载配置文件
        //系统类加载器加载我们自己编写的类,因为自己编写的类在src文件夹下,因此下面的路径写相对路径即可
        InputStream is = systemClassLoader.getResourceAsStream("config1.properties");
        //FileReader fileReader = new FileReader("config1.properties");//之前我们通过字符流加载配置文件
        Properties prop = new Properties();
        prop.load(is);
        //prop.load(fileReader);
        is.close();

        String username = prop.getProperty("username");
        String password = prop.getProperty("password");

        System.out.println(username);
        System.out.println(password);
    }
}

4、反射

4.1 反射概念

在这里插入图片描述

正常java程序运行时,先将.java文件编译成.class的字节码文件后,将需要用到的字节码文件加载到方法区进行调用。而反射机制实际上就是直接拿到.class的字节码文件后作解剖,即直接操作字节码文件对应的对象(即字节码对象,注:java中万物皆对象)。

4.2 反射的使用

在这里插入图片描述

4.2.1 获取类的字节码对象:

在这里插入图片描述

package com.itheima.reflect;
import com.itheima.domain.Student;

public class ReflectDemo1 {
    /**
     * 获取字节码对象的三种方式
     */
    public static void main(String[] args) throws ClassNotFoundException {
        //1、通过Class的静态方法forName
        Class<?> class1 = Class.forName("com.itheima.domain.Student");

        //2、类名.class
        Class<Student> class2 = Student.class;

        //3、Object类中的getClass()
        Student stu = new Student();
        Class<? extends Student> class3 = stu.getClass();

        System.out.println(class1);
        System.out.println(class2);
        System.out.println(class3);

        //字节码文件只有一份,那这三种方法获取到的字节码对象应该也是指向同一个地址,我们看下是否是这样:返回为true,表明正确
        System.out.println(class1 == class2);//true
        System.out.println(class2 == class3);//true
        System.out.println(class3 == class1);//true
    }
}

4.2.2 反射类中的构造方法

在这里插入图片描述
在这里插入图片描述

package com.itheima.reflect;
import java.lang.reflect.Constructor;

public class ReflectDemo2 {
    /**
     * 反射类中的构造方法
     *
     * 1. Constructor<?>[]  getConstructors()                                 返回所有公共构造方法对象的数组
     * 2. Constructor<?>[]  getDeclaredConstructors()                         返回所有构造方法对象的数组
     * 3. Constructor<?>[]  getConstructor(Class<?>...parameterTypes)         返回单个公共构造方法对象,参数是字节码对象,用来识别返回哪个构造方法
     * 4. Constructor<?>[]  getDeclaredConstructor(Class<?>...parameterTypes) 返回单个构造方法对象,参数是字节码对象,识别返回哪个构造方法
     *
     * --------------------------------------------------------------------------------------------------------
     * 创建对象的方法
     * 1.T newInstance(Object...initargs)    根据指定的构造方法创建对象
     * 2.setAccessible(boolean flag)         设置为true,表示取消访问检查
     */
    public static void main(String[] args) throws Exception {
        //1、获取类的字节码对象
        Class<?> studentClass = Class.forName("com.itheima.domain.Student");
        //2、反射构造方法对象
//        Constructor<?>[] constructors = studentClass.getConstructors();//返回所有公共构造方法对象的数组
        Constructor<?>[] constructors = studentClass.getDeclaredConstructors();//返回所有构造方法对象的数组
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }

        //3、反射单个构造方法
//        Constructor<?> constructor = studentClass.getConstructor();//返回单个公共构造方法对象
        Constructor<?> constructor = studentClass.getDeclaredConstructor(String.class, int.class);//返回带参构造方法对象
        constructor.setAccessible(true);//设置为true,表示取消访问检查。即:私有构造方法也可以有权限使用
        System.out.println(constructor);

        //4、通过构造方法对象,完成实例化
        Object o = constructor.newInstance("小明", 67);
        System.out.println(o);
    }
}

4.2.3 反射类中的成员变量

在这里插入图片描述
在这里插入图片描述

package com.itheima.reflect;
import com.itheima.domain.Student;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class ReflectDemo3 {
    /**
     * 反射类中的成员变量
     * 1.Field[] getFields()                   返回所有公共成员变量对象的数组
     * 2.Field[] getDeclaredFields()           返回所有成员变量对象的数组
     * 3.Field getFields(String name)          返回单个公共成员变量对象
     * 4.Field getDeclaredFields(String name)  返回单个成员变量对象
     --------------------------------------------------------------------
     * Field类的设置和获取方法
     * 1.void set(Object obj, Object value)    赋值
     * 2.Object get(Object obj)                获取值
     */
    public static void main(String[] args) throws Exception {
        //1、获取类的字节码对象
        Class<Student> studentClass = Student.class;

        //2、反射内部的成员变量对象
        Field[] declaredFields = studentClass.getDeclaredFields();//暴力返回所有的成员变量(私有共有都返回)
        Field[] fields = studentClass.getFields();//返回所有的公共成员变量
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        Field ageField = studentClass.getDeclaredField("age");
        Field nameField = studentClass.getDeclaredField("name");

        //3、设置访问权限
        ageField.setAccessible(true);
        nameField.setAccessible(true);

        //4、使用成员变量,完成赋值和获取操作
        Constructor<Student> constructor = studentClass.getConstructor();//获取反射类的构造方法
        Student student = constructor.newInstance();//用反射类的构造方法new一个对象
        ageField.set(student, 34);
        nameField.set(student, "马斯");
        System.out.println(ageField.get(student));
        System.out.println(nameField.get(student));
    }
}

在这里插入图片描述

4.2.4 反射类中的成员方法

在这里插入图片描述

package com.itheima.reflect;
import com.itheima.domain.Student;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ReflectDemo4 {
    /**
     * 反射类中的成员方法
     * 1.Method[] getMethods()               返回所有公共成员方法对象的数组,包括继承的
     * 2.Method[] getDeclaredMethods()       返回所有公成员方法对象的数组,不包括继承的
     * 3.Method getMethod(String name, Class<?>...parameterTypes)         返回单个
     * 4.Method getDeclaredMethod(String name, Class<?>...parameterTypes) 返回单个
     * ----------------------------------------------------------------------------
     * Method类的执行方法
     * Object invoke(Object obj, Object... args)       运行方法
     */
    public static void main(String[] args) throws Exception{
        //1、获取字节码对象
        Class<Student> studentClass = Student.class;

        //2、通过字节码对象,反射内部的成员方法对象(所有public修饰的)
        Method[] methods = studentClass.getMethods();//返回所有公共成员方法对象的数组,包括继承的
        Method[] declaredMethods = studentClass.getDeclaredMethods();//返回所有公成员方法对象的数组,不包括继承的
        for (Method method : declaredMethods) {
            System.out.println(method);
        }

        //3、通过字节码对象,反射指定的成员方法
        Method method1 = studentClass.getMethod("eat");//eat为方法名,空参eat()方法
        Method method2 = studentClass.getMethod("eat", int.class);//eat为方法名,带参数的eat(int num)方法
        System.out.println(method1);
        System.out.println(method2);

        //4、让反射到的成员方法执行
        Constructor<Student> constructor = studentClass.getConstructor();//用反射类的构造方法创建对象
        Student student = constructor.newInstance();
        method2.invoke(student, 2);//第一个参数为对象,第二个参数为方法的参数
    }
}

4.2.5 案例:

(1)
package com.itheima.reflect;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;

public class ReflectTest1 {
    /**
     * 需求:请向一个泛型为 Integer 的集合,添加一个 String 字符串
     * 思路:Java 中的泛型是假的,只在编译的时候有效。也就是说,字节码文件里没有泛型
     */
    public static void main(String[] args) throws Exception {
        ArrayList<Integer> arrayList = new ArrayList<>();
        Collections.addAll(arrayList, 1, 2, 3, 4);

        //1、获取list集合对象的字节码对象
        Class<? extends ArrayList> listClass = arrayList.getClass();
        //2、反射类中的add成员方法
        Method addMethod = listClass.getMethod("add", Object.class);
        //3、调用add方法,添加字符串。注:因为字节码文件没有泛型,因此我们可以向之前定义泛型为int的集合添加字符串
        addMethod.invoke(arrayList, "哈哈");
        
        System.out.println(arrayList);//[1, 2, 3, 4, 哈哈]
    }
}
(2)

在这里插入图片描述

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

    public void eat(){
        System.out.println("学生吃饭...");
    }

    public void study(){
        System.out.println("学生学习...");
    }
}
public class Teacher {
    private String name;
    private int age;

    public void eat(){
        System.out.println("老师吃饭...");
    }

    public void teach(){
        System.out.println("老师教学...");
    }
}
public class Worker {
    private String name;
    private int age;

    public void sleep(){
        System.out.println("工人睡觉...");
    }

    public void work(){
        System.out.println("工人工作...");
    }
}

config.properties文件:

className=com.itheima.reflect.Worker
methodName=sleep
package com.itheima.reflect;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Properties;

public class Test {
    /**
     * 从配置文件读取类名和方法名,然后获取字节码对象后,反射其方法并调用
     */
    public static void main(String[] args) throws Exception{
        //1、加载配置文件
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("testConfig.properties");
        //2、创建properties集合加载数据
        Properties prop = new Properties();
        prop.load(is);
        is.close();
        //3、取出数据
        String className = prop.getProperty("className");
        String methodName = prop.getProperty("methodName");
        //4、获取字节码对象
        Class<?> aClass = Class.forName(className);
        //5、用字节码对象反射构造方法并创建对象
        Object instance = aClass.getConstructor().newInstance();
        //6、反射成员方法并调用
        Method eat = aClass.getMethod(methodName);
        eat.invoke(instance);
    }
}

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

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

相关文章

GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程

大家好&#xff0c;今天给大家介绍一下&#xff1a;GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程。 文章目录 一、GPU算力平台概述人工智能智能发展为什么需要GPU算力平台 二、注册与登录账号注册流程 三、平台的应用之Anydoor应用启动器选择Anydoor的应用场景Anydoo…

阿里云代理商热销产品推荐

在数字化浪潮的推动下&#xff0c;企业对于云计算的依赖日益加深。阿里云&#xff0c;作为中国领先的云计算服务提供商&#xff0c;为企业提供了丰富多样的云产品和服务。本文将聚焦于阿里云代理商热销产品推荐&#xff0c;探讨其如何帮助企业高效利用云资源&#xff0c;加速数…

漏洞扫描工具

完整源码项目包获取→点击文章末尾名片&#xff01; 漏洞检测 该模块主要是对目标Web系统进行安全漏洞扫描&#xff0c;包括SQL注入、跨站脚本攻击&#xff08;XSS&#xff09;、弱密码、中间件漏洞。中间件漏洞扫描包括对Weblogic、Struts2、Tomcat 、Jboss、Drupal、Nexus的已…

SAP 销售确认收入的科目确定是由什么确定的?以及如何后台配置

财务同事问我&#xff0c;对销售单进行销售收入时确定收入科目是否是关联公司科目&#xff0c;我想当然的认为是由于客户主数据的贸易伙伴来决定的。后来查了一下配置&#xff0c;发现我搞错了。原来是通过客户的账号组来确定的。 然后我查了一下资料。分享如下&#xff1a; …

Kafka运维指南

一、Kafka架构概述 Kafka是一种分布式消息队列系统&#xff0c;采用发布 - 订阅模式&#xff0c;主要由生产者&#xff08;Producer&#xff09;、消费者&#xff08;Consumer&#xff09;、代理&#xff08;Broker&#xff09;和Zookeeper组成。 生产者&#xff1a;负责向Kaf…

Hadoop 实战笔记(一) -- Windows 安装 Hadoop 3.x

环境准备 安装 JAVA 1.8 Java环境搭建之JDK下载及安装下载 Hadoop 3.3.5 安装包 Hadoop 下载&#xff1a;https://archive.apache.org/dist/hadoop/common/ 一、JAVA JDK 环境检查 二、Hadoop(HDFS)环境搭建 1. 解压安装文件 hadoop-3.3.5.tar 2. 配置环境变量 HADOOP_HO…

Vscode辅助编码AI神器continue插件

案例效果 1、安装或者更新vscode 有些版本的vscode不支持continue,最好更新到最新版,也可以直接官网下载 https://code.visualstudio.com/Download 2、安装continue插件 搜索continue,还未安装的,右下脚有个Install,点击安装即可 <

rabbitmq——岁月云实战笔记

1 rabbitmq设计 生产者并不是直接将消息投递到queue,而是发送给exchange,由exchange根据type的规则来选定投递的queue,这样消息设计在生产者和消费者就实现解耦。 rabbitmq会给没有type预定义一些exchage,而实际我们却应该使用自己定义的。 1.1 用户注册设计 用户在…

江科大STM32入门——SPI通信笔记总结

wx&#xff1a;嵌入式工程师成长日记 &#xff08;一&#xff09;简介 四根通信线&#xff1a;SCK、MOSI、MISO、SS(片选信号) 同步&#xff08;同步通信是一种通信模式&#xff0c;在这种模式下&#xff0c;发送方和接收方在同一时刻进行数据传输。&#xff09;&#xff0c;全…

Tableau数据可视化与仪表盘搭建-可视化原则及BI仪表盘搭建

目录 可视化原则 BI仪表盘搭建 仪表盘搭建原则 明确仪表盘主题 仪表盘主题拆解 开发设计工作表 经营情况总览&#xff1a;突出显示的文字 经营数据详情&#xff1a;表格 每日营收数据&#xff1a;多轴折线图 每日流量数据&#xff1a;双轴组合图 新老客占比&#xf…

Chrome访问https页面显示ERR_CERT_INVALID,且无法跳过继续访问

在访问网页的时候&#xff0c;因为浏览器自身的安全设置问题&#xff0c; 对于https的网页访问会出现安全隐私的提示&#xff0c; 甚至无法访问对应的网站&#xff0c;尤其是chrome浏览器&#xff0c; 因此本文主要讲解如何设置chrome浏览器的设置&#xff0c;来解决该问题&…

微软发布AIOpsLab:一个开源的全面AI框架,用于AIOps代理

在当今这个云计算技术迅猛发展的时代&#xff0c;企业面临着前所未有的挑战与机遇。随着云基础设施的日益复杂化&#xff0c;它们成为了企业运营不可或缺的支柱。网站可靠性工程师&#xff08;Site Reliability Engineers&#xff0c;简称SRE&#xff09;和DevOps团队肩负着关键…

Pixel 6a手机提示无法连接移动网络,打电话失败!

1、开启VoLTE 2、如果没有&#xff0c;下载shizuku和PixelIMS应用。 shizuke Releases RikkaApps/Shizuku GitHub PixellMS Release v1.2.8 kyujin-cho/pixel-volte-patch GitHub 3、安装shizuke启动&#xff0c;开通root可以直接点击下面的启动&#xff0c;如果没有就…

【Arm】Arm 处理器的半主机(semihosting)机制

概览 通过 semihosting 机制&#xff0c;主机可以通过调试器使用目标计算机 IO 接口。 例如开发者的 PC 通过 J-Link 来使用 STM32 MCU 的输入输出。 这些功能的示例包括键盘输入、屏幕输出和硬盘 I/O。例如&#xff0c;可以使用此机制启用 C Library 中的函数&#xff0c;如…

Wireshark 学习笔记1

1.wireshark是什么 wireshark是一个可以进行数据包的捕获和分析的软件 2.基本使用过程 &#xff08;1&#xff09;选择合适的网卡 &#xff08;2&#xff09;开始捕获数据包 &#xff08;3&#xff09;过滤掉无用的数据包 &#xff08;4&#xff09;将捕获到的数据包保存为文件…

2025-01-06 Unity 使用 Tip2 —— Windows、Android、WebGL 打包记录

文章目录 1 Windows2 Android2.1 横版 / 竖版游戏2.2 API 最低版本2.3 目标帧率2.3.1 targetFrameRate2.3.2 vSyncCount2.3.3 Unity 默认设置以及推荐设置2.3.4 Unity 帧率托管 3 WebGL3.1 平台限制3.2 打包报错记录 13.3 打包报错记录 2 ​ 最近尝试将写的小游戏打包&#xff…

湘潭大学人机交互复习

老师没给题型也没划重点&#xff0c;随便看看复习了 什么是人机交互 人机交互&#xff08;Human-Computer Interaction&#xff0c;HCI&#xff09;是关于设计、评价和实现供人们使用的交互式计算机系统&#xff0c;并围绕相关的主要现象进行研究的学科。 人机交互研究内容 …

基于FPGA的出租车里程时间计费器

基于FPGA的出租车里程时间计费器 功能描述一、系统框图二、verilog代码里程增加模块时间增加模块计算价格模块上板视频演示 总结 功能描述 &#xff08;1&#xff09;&#xff1b;里程计费功能&#xff1a;3公里以内起步价8元&#xff0c;超过3公里后每公里2元&#xff0c;其中…

基于FPGA的洗衣机控制器电子定时器

文章目录 功能描述 一、框架 二、verilog代码 控制模块实现 三、视频上板效果展示 功能描述 &#xff08;1&#xff09;定时启动正转20秒暂停10秒反转20秒暂 停10秒&#xff0c;定时未到回到“正转20秒暂停10秒……”&#xff0c;定时到则停止; 若定时到&#xff0c;则停…

【Linux系列】Vim 编辑器中的高效文本编辑技巧:删除操作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…