类加载机制与反射

类加载机制与反射

一.虚拟机类加载机制

1.虚拟机类加载机制概述

  • 虚拟机把描述类的数据从class文件加载到内存

  • 将类的数据进行校验,转换解析和初始化

  • 形成可以被java虚拟机直接使用的java类型

2.类加载过程

  • 当程序要使用某个类时,如果该类还未被加载到内存中,系统会通过加载,连接,初始化三步来实现对这个类的加载.

(1)加载

  • 就是指将class文件读入内存,并为之创建一个Class对象.任何类被使用时系统都会建立一个Class对象

(2)链接

  • 验证是否有正确的内部结构,并和其他类协调一致;准备负责为类的静态成员分配内存,并设置默认初始化值解析将类的二进制数据中的符号引用替换为直接引用—> 方便计算机 以后寻址

(3)初始化

  • 在使用时需要初始化

3.类的初始化时机

  • 第一次创建类的实例
  • 类的静态成员使用
  • 类的静态方法调用
  • 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
  • 初始化某个类的子类
  • 直接使用java.exe命令来运行某个主类 —> 主方法运行时 会自动的加载主方法所在的类的字节码文件

二.类加载器

1.类加载器概述

  • 类加载器是负责加载类的对象,将class文件(硬盘)加载到内存中,并为之生成对应的java.lang.Class对象.

(1)例

Hello.class------->类加载器------>Hello.class 
  • Hello:这个类的类对象 (就是Class类的对象)
  • 类对象: 字节码信息形成的对象(包含了这个类中所有的信息) —> 是 Class 类 类型的对象

2.类加载器的分类

(1)分类

类加载器分类描述
Bootstrap ClassLoader引导类是所有加载器的父加载器也被称为根类加载器,负责Java核心类的加载,比如System,String等.
Extension ClassLoader扩展类负责JRE的扩展目录中jar包的加载,在JDK中JRE的lib目录下ext目录.
Application ClassLoade系统类加载自己写的类 ,负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径.
自定义类开发人员可以通过继承java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求.

(2)继承关系

-Bootstrap ClassLoader-Extension ClassLoader-Application ClassLoader

3.双亲委派机制

  • 一有事 就找爹 爹做不了的 自己再干

在这里插入图片描述

(1)双亲委派机制描述

  • 指当一个类加载器收到一个类加载请求时,该类加载器首先会把请求委派给父类加载器.每个类加载器都是如此,只有在父类加载器在自己的搜索范围内找不到指定类时,子类加载器才会尝试自己去加载.

(2)双亲委派模型工作过程

a.
  • 当Application ClassLoader 收到一个类加载请求时,他首先不会自己去尝试加载这个类,而是将这个请求委派给父类加载器Extension ClassLoader去完成.
b.
  • 当Extension ClassLoader收到一个类加载请求时,他首先也不会自己去尝试加载这个类,而是将请求委派给父类加载器Bootstrap ClassLoader去完成.
c.
  • 如果Bootstrap ClassLoader加载失败(在<JAVA_HOME>\lib中未找到所需类),就会让Extension ClassLoader尝试加载.
d.
  • 如果Extension ClassLoader也加载失败,就会使用Application ClassLoader加载.
e.
  • 如果Application ClassLoader也加载失败,就会使用自定义加载器去尝试加载.
f.
  • 如果均加载失败,就会抛出ClassNotFoundException异常.

(3)例子

  • 当一个Hello.class这样的文件要被加载时.不考虑我们自定义类加载器,首先会在AppClassLoader中检查是否加载过,如果有那就无需再加载了.如果没有,那么会拿到父加载器,然后调用父加载器的loadClass方法.父类中同理会先检查自己是否已经加载过,如果没有再往上.注意这个过程,直到到达Bootstrap classLoader之前,都是没有哪个加载器自己选择加载的.如果父加载器无法加载,会下沉到子加载器去加载,一直到最底层,如果没有任何加载器能加载,就会抛出ClassNotFoundException.

4.CLassLoader类

(1)ClassLoader类概述

  • ClassLoader 叫做类加载器.虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流” 也就是.class字节码文件,这个动作放到java虚拟机外部去实现,以便让应用程序自己决定去如何获取所需要的类,实现这个动作的代模块称之为“类加载器”.

(2)ClassLoader方法

方法描述
static ClassLoader getSystemClassLoader()返回用于委派的系统类加载器
ClassLoader getParent()返回父类加载器进行委派

(3)方法示例

package com.lfg.test;
public class Test02 {public static void main(String[] args) {ClassLoader cl = ClassLoader.getSystemClassLoader();System.out.println(cl);                     //AppClassLoaderSystem.out.println(cl.getParent());         //ExtClassLoaderSystem.out.println(cl.getParent().getParent());     //null}
}

三.反射应用

1.反射机制的概述

  • 反射是指在运行时去获取一个类的变量和方法信息.然后通过获取到的信息来创建对象,调用方法的一种机制.
  • 由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展.

2.获取Class类的对象

(1)描述

  • Class类: Class类型的实例 表示正在运行的java应用程序的类或者接口 类对象.
  • Class类的对象: 想获取和操作类中的内容,首先要获取类的字节码对象(Class类对象),每一个正在运行的类,都有对应的字节码对象,获取了类的字节码对象,就可以使用这个对象的所有方法,这些方法都定义在Class类型中.

(2)示例

a.Student类
package com.lfg.pojo;import java.util.Objects;public class Student {private String sname;private String sgender;private int sage;public int sid;public Student() {}private Student(String sname) {this.sname = sname;}private Student(String sname, String sgender) {this.sname = sname;this.sgender = sgender;}public Student(String sname, String sgender, int sage) {this.sname = sname;this.sgender = sgender;this.sage = sage;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public String getSgender() {return sgender;}public void setSgender(String sgender) {this.sgender = sgender;}public int getSage() {return sage;}public void setSage(int sage) {this.sage = sage;}public int getSid() {return sid;}public void setSid(int sid) {this.sid = sid;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return sage == student.sage && Objects.equals(sname, student.sname) && Objects.equals(sgender, student.sgender);}@Overridepublic int hashCode() {return Objects.hash(sname, sgender, sage);}@Overridepublic String toString() {return "Student{" +"sname='" + sname + '\'' +", sgender='" + sgender + '\'' +", sage=" + sage +'}';}public void printInfo(){toString();}public void prinInfoFamle(String famle){System.out.println("famle=>"+famle);}private void pirntInfoName(String sname){System.out.println("sname=>"+sname);}private void pirntInfoPrivate(){toString();}
}
b.测试类
package com.lfg.test;import com.lfg.pojo.Student;public class Test03 {public static void main(String[] args) {Student student = new Student();try {//获取Student类的字节码对象Class c1 = Student.class;Class c2 = student.getClass();Class c3 = Class.forName("com.lfg.pojo.Student");System.out.println(c1 == c2);System.out.println(c2 == c3);} catch (ClassNotFoundException e) {throw new RuntimeException(e);}}
}

3.反射获取构造方法

(1)方法

方法描述
Constructor<?>[] getConstructors()返回所有公共构造方法对象的数组
Constructor<?>[] getDeclaredConstructors()返回所有构造方法对象的数组
Constructor getConstructor(Class<?>… parameterTypes)返回单个公共构造方法对象
Constructor getDeclaredConstructor(Class<?>…parameterTypes)返回单个构造方法对象

(2)Constructor类型

a.描述
  • 表示构造方法类型,这个类的每个对象,都是一个确定的,具体的构造方法
  • 构造方法对象应该具有的功能: 获取构造方法各种信息(构造方法修饰符、构造方法名称、构造方法的参数列表、构造方法的注解),最基本的一个功能就是,创建对象.
b.Constructor类用于创建对象的方法
方法描述
T newInstance(Object…initargs)根据指定的构造方法创建对象,参数为所运行构造方法需要的实际参数.

(3)示例

package com.lfg.test;import com.lfg.pojo.Student;import java.lang.reflect.Constructor;
import java.util.Arrays;public class Test04 {public static void main(String[] args) {Student student = new Student();//获取Student类有哪些属性,哪些构造方法,哪些一般方法?try {//获取Student类的字节码对象Class c1 = Student.class;Class c2 = student.getClass();Class c3 = Class.forName("com.lfg.pojo.Student");//获取Student类的公共的构造方法Constructor constructor1[] = c3.getConstructors();System.out.println(Arrays.toString(constructor1));System.out.println("-----------------------------------------");//获取Student类所有的构造方法Constructor constructor2[] = c3.getDeclaredConstructors();System.out.println(Arrays.toString(constructor2));System.out.println("-----------------------------------------");//获取某公共的无参的构造方法Constructor constructor3 = c3.getConstructor();System.out.println(constructor3);System.out.println("-----------------------------------------");//获取某公共的有参的构造方法Constructor constructor4 = c3.getConstructor(String.class,String.class,int.class);System.out.println(constructor4);System.out.println("-----------------------------------------");//获取某私有的有参的构造方法Constructor constructor5 = c3.getDeclaredConstructor(String.class);System.out.println(constructor5);System.out.println("-----------------------------------------");//使用某公共的无参的构造方法创建对象Student stu1 = (Student)constructor3.newInstance();stu1.setSname("mary");System.out.println(stu1.getSname());System.out.println("-----------------------------------------");//使用某公共的有参的构造方法创建对象Student stu2 = (Student) constructor4.newInstance("范冰冰","female",1);System.out.println(stu2.getSname());System.out.println("-----------------------------------------");//使用某私有的有参的构造方法创建对象//使用暴力反射干掉privateconstructor5.setAccessible(true);Student stu3 = (Student)constructor5.newInstance("刘仔");System.out.println(stu3.getSage()+","+stu3.getSname());} catch (Exception e) {e.printStackTrace();}}
}

4.反射获取成员变量

(1)方法

方法描述
Field[] getFields()Field[] getFields()返回所有公共成员变量对象的数组
Field[] getDeclaredFields()返回所有成员变量对象的数组
Field getField(String name)返回单个公共成员变量对象
Field getDeclaredField(String name)返回单个成员变量对象
  • Class类获取成员变量对象
  • Field类型
    • 表示:一个成员变量类型,每个对象都是一个具体的成员变量
    • 作用: 获取成员变量的各种信息(修饰符、注解、名称),做各种数据类型的转换
  • Field类用于给成员变量赋值的方法
    • set(Object obj, Object value):用于给obj对象的,该成员变量,赋value值
  • Field类获取成员变量值的方法
    • get(Object obj): 用于获取obj对象的指定成员变量值

(2)示例

package com.lfg.test;import com.lfg.pojo.Student;import java.lang.reflect.Field;
import java.util.Arrays;public class Test05 {public static void main(String[] args) {Student student = new Student();//获取Student类有哪些属性,哪些构造方法,哪些一般方法?try {//获取Student类的字节码对象Class c1 = Student.class;Class c2 = student.getClass();Class c3 = Class.forName("com.lfg.pojo.Student");//获取Student类的公共的成员变量Field field1[] = c3.getFields();System.out.println(Arrays.toString(field1));System.out.println("-----------------------------------");//获取Student类所有的成员变量Field field2[] = c3.getDeclaredFields();System.out.println(Arrays.toString(field2));System.out.println("-----------------------------------");//获取Student类的某公共的成员变量Field field3 = c3.getField("sid");System.out.println(field3);System.out.println("-----------------------------------");//获取Student类的某私有的成员变量Field field4 = c3.getDeclaredField("sname");System.out.println(field4);System.out.println("-----------------------------------");//使用Student类的某公共的成员变量field3.set(student,1);  //student.setSid(1);System.out.println(field3.get(student)); //student.getSid()System.out.println("-----------------------------------");//使用Student类的某私有的成员变量field4.setAccessible(true);field4.set(student,"蔡坤");System.out.println(field4.get(student));} catch (Exception e) {e.printStackTrace();}}
}

5.获取类中的成员方法

(1)方法

方法描述
Method[] getMethods()返回所有公共成员方法对象的数组,包括继承的
Method[] getDeclaredMethods()返回所有成员方法对象的数组,不包括继承的
Method getMethod(String methodName, Class<?>…parameterTypes)返回单个公共成员方法对象
Method getDeclaredMethod(String methodName, Class<?>…parameterTypes)返回单个成员方法对象
  • Class类获取成员方法对象
  • Method类型
    • 表示:成员方法的类型,该类型的每个对象,都是一个具体的成员方法
    • 作用:获取成员方法信息,运行方法
  • Method类用于执行方法的功能
    • invoke(Object obj, Object…values)
      • 调用obj对象的成员方法
      • 参数是values
      • 返回值是Object类型

(2)示例

package com.lfg.test;import com.lfg.pojo.Student;import java.lang.reflect.Method;
import java.util.Arrays;public class Test06 {public static void main(String[] args) {Student student = new Student();//获取Student类有哪些属性,哪些构造方法,哪些一般方法?try {//获取Student类的字节码对象Class c1 = Student.class;Class c2 = student.getClass();Class c3 = Class.forName("com.lfg.pojo.Student");//获取Student类的公共的成员方法(包括继承来的)Method method1[] = c3.getMethods();System.out.println(Arrays.toString(method1));System.out.println("---------------------------------");//获取Student类的所有的成员方法Method method2[] = c3.getDeclaredMethods();System.out.println(Arrays.toString(method2));System.out.println("---------------------------------");//获取Student类的某公共的成员方法Method method3 = c3.getMethod("printInfo");System.out.println(method3);System.out.println("---------------------------------");//获取Student类的某私有的成员方法Method method4 = c3.getDeclaredMethod("pirntInfoPrivate");System.out.println(method4);System.out.println("---------------------------------");//使用Student类的某公共的成员方法method3.invoke(student);  //student.eat();System.out.println("---------------------------------");//使用Student类的某私有的成员方法method4.setAccessible(true);method4.invoke(student);} catch (Exception e) {e.printStackTrace();}}
}

6.暴力反射

(1)概述

  • 通过Class类中getDeclaredXXX方法以获取类中的所有声明的成员(属性、方法、构造),私有的成员也可以获取到.但是私有成员进行访问使用时,会因为权限问题导致失败,因此就需要暴力反射解决访问私有的问题

(2)修改对象的访问权限

  • AccessibleObject类是Field,Method和Constructor对象的基类. 它提供了将反射对象标记为在使用它时抑制默认Java语言访问控制检查的功能.
  • setAccessible(boolean flag)
    • true的值表示反射对象应该在使用时抑制Java语言访问检查
    • false的值表示反映的对象应该强制执行Java语言访问检查
  • 一旦设定当前对象可以访问,私有的成员也可以被访问,被修改

四.反射实现多方法请求

1.BaseServlet

package com.lfg.servlet;import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class BaseServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws IOException {req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");String flag = req.getParameter("flag");//获取当前类的字节码对象Class clazz = this.getClass();try {//flag其实就是要执行的方法的名字//所有需要执行的方法的参数都是request和response//根据方法名及其参数的数据类型获取要执行的方法Method method = clazz.getDeclaredMethod(flag,HttpServletRequest.class,HttpServletResponse.class);method.setAccessible(true);method.invoke(this,req,resp);} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}
}

2.使用

  • 使用要求:
    • 前端必须传递flag数据,且该数据的值必须和servlet中要执行的方法名字一致
    • servlet中所有需要执行的方法的参数必须是request和response
public class XxxServlet extends BaseServlet{}

五.分页示例

1.分页概述

  • 当前页页码:page

  • 每页显示数据条数:rows

  • 从哪一条开始取(偏移量):index = (page-1)*rows

  • 数据总条数:countRows

  • 总页数:countPages

  • 上一页页码:prevPage,如果当前页是第一页,需要判断

  • 下一页页码:nextPage,如果当前页是最后一页,需要判断

2.PageUtil工具类

package com.lfg.utils;public class PageUtil {private int page;      //当前页页码private int rows;       //每页显示条数private int index;      //偏移量private int countRows;      //总条数private int countPages;     //总页数private int prevPage;       //当前页的上一页页码private int nextPage;       //当前页的下一页页码public PageUtil(String page,int rows,int countRows){init_page(page);this.rows = rows;init_index();this.countRows = countRows;init_countPages();init_prevPage();init_nextPage();}private void init_page(String page){if (page == null || "".equals(page)) {this.page = 1;} else {this.page = Integer.parseInt(page);}}private void init_index(){this.index = (this.page - 1) * this.rows;}private void init_countPages(){int mod = this.countRows % this.rows;if (mod == 0) {this.countPages = this.countRows / this.rows;} else {this.countPages = this.countRows / this.rows + 1;}}private void init_prevPage(){if (this.page == 1) {this.prevPage = 1;} else {this.prevPage = this.page - 1;}}private void init_nextPage(){if (this.page == this.countPages) {this.nextPage = this.countPages;} else {this.nextPage = this.page + 1;}}public int getPage() {return page;}public int getRows() {return rows;}public int getIndex() {return index;}public int getCountRows() {return countRows;}public int getCountPages() {return countPages;}public int getPrevPage() {return prevPage;}public int getNextPage() {return nextPage;}
}

3.index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>恭喜您,登录成功<br><a href="studentServlet?flag=getStudentByPage&page=1">展示学生信息</a>
</body>
</html>

4.Dao层

(1)StudentDao

    int getCountRows();List<Student> getStudentByPage(PageUtil pageUtil);

(2)StudentDaoImpl

    @Overridepublic int getCountRows() {int countRows = 0;String sql = "select count(*) from student";try {countRows = (int)(long)queryRunner.query(sql, new ScalarHandler());} catch (SQLException e) {e.printStackTrace();}return countRows;}@Overridepublic List<Student> getStudentByPage(PageUtil pageUtil) {List<Student> list = null;String sql = "select * from student limit ?,?";try {list = queryRunner.query(sql, new BeanListHandler<>(Student.class),pageUtil.getIndex(),pageUtil.getRows());} catch (SQLException e) {e.printStackTrace();}return list;}

5.Service层

(1)StudentService

    int getCountRows();List<Student> getStudentByPage(PageUtil pageUtil);

(2)StudentServiceImpl

    @Overridepublic int getCountRows() {return studentDao.getCountRows();}@Overridepublic List<Student> getStudentByPage(PageUtil pageUtil) {return studentDao.getStudentByPage(pageUtil);}

6.StudentServlet

    protected void getStudentByPage(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//分页数据查询String page = req.getParameter("page");int rows = 10;int countRows = studentService.getCountRows();PageUtil pageUtil = new PageUtil(page, rows, countRows);List<Student> list = studentService.getStudentByPage(pageUtil);req.setAttribute("stuList",list);req.setAttribute("pageUtil",pageUtil);req.getRequestDispatcher("student.jsp").forward(req,resp);}

7.Student.jsp

在这里插入图片描述

六.挂载图片

1.学生表添加头像列

ALTER TABLE student ADD sphoto VARCHAR(50);

2.修改实体类

private String sphoto;

3.挂载图片

在这里插入图片描述

4.测试挂载是否成功

在这里插入图片描述

5.完善student.jsp内容

在这里插入图片描述

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

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

相关文章

Git 常用命令速查

一、 Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态git commit 提交git branch -a 查看所有的分支git branch -r 查看远程所有分支git commit -am "init" 提交并且加注释git remote add origin git192.168.1.119:ndshowgit push origin mas…

centos卸载mysql库全流程

&#xff08;1&#xff09;暂停服务 systemctl stop mysqld &#xff08;2&#xff09;查看所有的安装包&#xff0c;将其卸载 rpm -qa |grep mysql rpm -q ( or --query) options -a 查询所有安装的软件包 &#xff08;3&#xff09;使用yum卸载安装的mysql [rootbo /…

科研论文中PPT图片格式选择与转换:EPS、SVG 和 PDF 的比较

当涉及论文中的图片格式时&#xff0c;导师可能要求使用 EPS 格式的图片。EPS&#xff08;Encapsulated PostScript&#xff09;是一种矢量图格式&#xff0c;它以 PostScript 语言描述图像&#xff0c;能够无损地缩放并保持图像清晰度。与像素图像格式&#xff08;如 PNG 和 J…

Qt搭建MQTT编程环境

QT 部署官方MQTT模块 在Qt Creator中&#xff0c;默认是没有部署Mqtt模块的&#xff0c;在使用QT编程之前&#xff0c;先把mqtt 模块部署到开发环境当中。参考博文&#xff1a;Qt开发技术&#xff1a;mqtt介绍、QtMqtt编译和开发环境搭建_长沙红胖子-CSDN博客 下载 Qt官方在g…

收款码在线生成系统源码/开源layui前端框架/附多套前端UI模板/三合一收款码生成系统源码

源码简介&#xff1a; 收款码在线生成系统源码&#xff0c;它是采用开源layui前端框架&#xff0c;并且它附多套前端UI模板&#xff0c;作为三合一收款码生成系统源码&#xff0c;界面简洁大方。 Layui前端的多合一收款码在线生成系统源码&#xff0c;附带了多套精美的前端UI…

数据库——安全性

智能2112杨阳 一、目的与要求&#xff1a; 1、设计用户子模式 2、根据实际需要创建用户角色及用户&#xff0c;并授权 3、针对不同级别的用户定义不同的视图&#xff0c;以保证系统的安全性 二、内容&#xff1a; 先创建四类用户角色&#xff1a; 管理员角色Cusm、客户角…

STM32——串口实验(非中断)

需求&#xff1a; 接受串口工具发送的字符串&#xff0c;并将其发送回串口工具。 硬件接线&#xff1a; TX -- A10 RX -- A9 一定要记得交叉接线&#xff01;&#xff01; 串口配置&#xff1a; 1. 选定串口 2. 选择模式 异步通讯 3. 串口配置 4. 使用MicroLIB库 从…

数据结构 | 大根堆

思维导图 代码 #include<stdio.h> #include<iostream> using namespace std; void HeapAdjust(int* arr, int start, int end) {int temp arr[start];for (int i 2 * start 1; i < end; i 2 * i 1) //end可以取到等于 因为它是最后一个元素{if (i<end…

Spring boot注解

1.RestController RestController 注解用于标识一个类,表示该类的所有方法都返回JSON或XML响应&#xff0c;而不是视图页面。它是Controller和ResponseBody的组合 2.RequestMapping RequestMapping 注解用于映射HTTP请求到控制器方法或类。它可以用于类级别和方法级别,用于定…

UI5 development on VS Studio code

今天来分享一下如何VS studio code 上UI5开发环境的搭建 1.安装Node.js 路径&#xff1a;Node.js 因安装步骤较为简单&#xff0c;故不在此赘述。 验证方法如下&#xff1a;WINR-->CMD--->node --version 出现下图即可 2. 安装UI5 CLI (为了后面我们方便使用UI5 的命令…

向ChatGPT提特殊问题,可提取原始训练数据!

随着ChatGPT等模型的参数越来越大&#xff0c;预训练数据也呈指数级增长。谷歌DeepMind、华盛顿大学、康奈尔大学等研究人员发现,无论是开源还是闭源模型&#xff0c;在训练过程中皆能记住一定数量的原始训练数据样本。 如果使用特定的恶意攻击&#xff0c;便能轻松地从模型中…

python pip 相关缓存清理(windows+linux)

pip会大量缓存&#xff0c;如果全部堆在系统盘&#xff0c;会造成别的无法使用 windows和linux通用 一、linux linux是在命令行操作 1.查看缓存位置 pip cache dir我这里默认是在/root/.cache/pip 2.查看大小 du -sh /root/.cache/pip结果如下&#xff1a; 3.清理&#…

深入理解 Go Channel:解密并发编程中的通信机制

一、Channel管道 1、Channel说明 共享内存交互数据弊端 单纯地将函数并发执行是没有意义的。函数与函数间需要交互数据才能体现编发执行函数的意义虽然可以使用共享内存进行数据交换&#xff0c;但是共享内存在不同的goroutine中容易发送静态问题为了保证数据交换的正确性&am…

Windows的C盘爆掉了怎么办?

本文参考&#xff1a; C盘太满怎么办&#xff1f;亲测8种好用方法&#xff01; 如果C盘的分区爆掉了&#xff0c;变红色了&#xff0c;是时候该处理这个问题了&#xff0c;解决你的C盘焦虑&#xff01; 第一招&#xff1a;删除C盘文件 首先你会想到清理C盘里面的文件&#x…

数据结构之----数组、链表、列表

数据结构之----数组、链表、列表 什么是数组&#xff1f; 数组是一种线性数据结构&#xff0c;它将相同类型的元素存储在连续的内存空间中。 我们将元素在数组中的位置称为该元素的索引。 数组常用操作 1. 初始化数组 我们可以根据需求选用数组的两种初始化方式&#xff…

机器视觉系统选型-同轴光源分类及应用场景

同轴光源 从与相机同轴的方向均匀照射漫射光 Mark点定位条码识别二维码识别反光物体表面缺陷检测 高亮同轴光源 照射光线与水平方向成低角度夹角Mark点定位反光件表面凹坑、损伤、缺陷印刷电路板二维码识别 平行同轴光源 从与相机同轴方向照射平行度高 的平行光尺寸测量玻璃检…

团队git操作流程

项目的开发要求 项目组厉员每天代码提交不少于20次企业项目开发代码的每天的提交一般提交3-5次代码仓库的管理 git的基础操作流程 命令模式 git push插件模式 vscode git graphGUI软件管理模式 sourcetree git在项目团队化开发中的应用 master(一般是不动的)dev (主要是拿…

2. 如何通过公网IP端口映射访问到设备的vmware虚拟机的ubuntu服务器

文章目录 1. 主机设备是Windows 11系统2. 安装vmware虚拟机3. 创建ubuntu虚拟机&#xff08;据说CentOS 7 明年就不维护了&#xff0c;就不用这个版本的linux了&#xff09;4. 安装nginx服务:默认端口805. 安装ssh服务:默认端口226. 设置主机 -> ubuntu的端口映射7. 设置路由…

【Amis Low Code 结合FastAPI进行前端框架开发】

官方文档 封装思想 直接复制官网json数据即可开发每个json中的接口由fastapi 转发&#xff08;透传&#xff09;使其开发模式与前端思维一致 基础组件 from amis import Page, Service, App from pydantic import BaseModel, Field from fastapi import FastAPI, Request, …

c++学习之智能指针

前言&#xff1a;在此之前我们已经学习到了异常的使用&#xff0c;虽然异常在大部分情况都还可以&#xff0c;但也存在太多缺陷&#xff0c;对于异常的问题&#xff0c;入内存泄漏&#xff0c;在复杂的场景下使用起来也是非常麻烦。为了更好的解决这些问题&#xff0c;c11中引入…