当前位置: 首页 > news >正文

⛳ Java 反射

目录

  • ⛳ Java 反射
    • 🎨 一、反射概述
      • **🎃 使用反射的前提条件: **
      • 🎲 类正常加载过程如下图:
      • 反射优缺点:
      • 🧸 Java反射机制提供的功能:
      • **🥅 反射主要API**
    • 🏭 二、反射的使用
      • 🎯 2.1、`class`类概述
      • 🎒 2.2、得到`Class`的实例
      • 📐 2.3、`Java`内置 9 大 `Class`实例
      • 📢 2.4、获取类中的构造器
      • ✨ 2.5、调用构造器创建对象
      • 🚜 2.6、获取类中的成员变量并调用(setAccessible)
      • 批量获取的方法:
      • 获取单个的方法:
      • 设置字段的值:
      • 👣 2.7、获取类中的成员方法并调用
      • 获取单个的方法:
      • 调用方法:
      • 🐾 2.8、反射方法的其他使用之通过反射运行配置文件内容
      • 🎈 2.9、反射方法的其它使用之越过泛型检查
    • 🎁 三、反射面试题

⛳ Java 反射

🎨 一、反射概述

Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助Reflection API获取任何类的内部信息,并直接操作任意对象的内部属性及方法。

image-20230816203125866

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

**🎃 使用反射的前提条件: **

​ 必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码),原因是要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。

🎲 类正常加载过程如下图:

image-20230816203604955

加载完类之后, 在堆内存的方法区中就产生了一个Class类型的对象( 一个类只有一个Class对象) , 这个对象就包含了完整的类的结构信息。 我们可以通过这个对象看到类的结构。 这个对象就像一面镜子, 透过这个镜子看到类的结构, 所以, 我们形象的称之为: 反射。

反射优缺点:

  • 优点
    1. 可以在运行程序的过程中,操作这些对象。
    2. 可以降低耦合度,提高程序的可扩展性。
  • 缺点
    1. 反射很强大,但是消耗性能。主要是为了做工具和框架使用的。

🧸 Java反射机制提供的功能:

    • 在运行时判断任意一个对象所属的类
    • 在运行时构造任意一个类的对象
    • 在运行时判断任意一个类所具有的成员变量和方法
    • 在运行时获取泛型信息
    • 在运行时调用任意一个对象的成员变量和方法
    • 在运行时处理注解
    • 生成动态代理

🥅 反射主要API

    • java.lang.Class:代表一个类
    • java.lang.reflect.Method:代表类的方法
    • java.lang.reflect.Field:代表类的成员变量
    • java.lang.reflect.Constructor:代表类的构造器

🏭 二、反射的使用

🎯 2.1、class类概述

在Object类中定义了以下的方法,此方法将被所有子类继承:public final Class getClass()以上的方法返回值的类型是一个Class类,此类是Java反射的源头,实际上所谓反射从程序的运行结果来看也很好理解,即:可以通过对象反射求出类的名称。

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象(包括基本数据类型)。Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了。

🎒 2.2、得到Class的实例

  1. Student stu = new User();Class clz = stu.getClass();:对象.getClass();得到对象的真实类型,因为在Object里,所以每个类都有该方法。
  2. Class<Student> clz = Student.class; : 数据类型.class(就是一份字节码)。
  3. Class.forName(String className); :根据一个类的全限定名来构建Class对象,Class<?> clz = Class.forName("com.gbx.Student");,这里泛型写<?>原因是此时class不知道类,因为传的是字符串。

代码示例:

 package com.gbx;public class Demo {public static void main(String[] args) {//obj.getClass()方式获取Class对象  Student stu1 = new Student();//new 产生一个Student对象,一个Class对象。Class stuClass = stu1.getClass();//获取Class对象//类名.class方式获取Class对象Class stuClass2 = Student.class;//Class.forName(String className)方式获取Class对象try {Class stuClass3 = Class.forName("com.gbx.Student");//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名} catch (ClassNotFoundException e) {e.printStackTrace();}}}

注:这三种方法获取的都是同一个class对象,因为表示都是JVM中共同的一份字节码。

📐 2.3、Java内置 9 大 Class实例

​ 对于对象来说,可以直接使用obj.getClass()获取Class实例,但是基本数据类型,就没有类的权限定名,也没有getClass方法,那么如何使用Class类来表示基本数据类型的Class实例?

byte,short,int,long,char,float,double,boolean ,void关键字,上述8种类型和void关键字,都有class属性。例子如下:

  • 表示int的Class对象: Class clz = int.class;
  • 表示boolean的Class对象: boolean.class;
  • void: Class clz = void.class;
  • 表示数组的Class实例:String[] sArr1 = {“A”,“C”},Class clz = String[].class;//所有具有相同元素类型和维数的数组才共享同一份字节码(Class对象);

所有的数据类型都有class属性,表示都是Class对象。

注意:

int的包装类是Integer,那么 Integer.class == int.class ?结果是false,说明是两份字节码.

Integer 和 int 不是同一种数据类型,在八大基本数据类型的包装类中都有一个常量:TYPE,TYPE表示的是该包装类对应的基本数据类型的Class实例。例子如下:

  • Integer.TYPE—>int.class
  • Integer.TYPE == int.class;//YES
  • Integer.TYPE == Integer.class;//ERROR

📢 2.4、获取类中的构造器

  1. Class类获取构造器方法:Constructor类:表示类中构造器的类型,Constructor的实例就是某一个类中的某一个构造器。

  2. 批量获取的方法:

    • public Constructor<?>[] getConstructors():该方法只能获取当前Class所表示类的public修饰的构造器。

    • public Constructor<?>[] getDeclaredConstructors():获取当前Class所表示类的所有的构造器,和访问权限无关。

  3. 获取单个的方法:

    • public Constructor<T> getConstructor(Class<?>... parameterTypes) :获取当前Class所表示类中指定的一个public的构造器。
    • public Constructor getDeclaredConstructor(Class<?>... parameterTypes):获取当前Class所表示类的所有构造器中指定的一个构造器(可以是私有、受保护、默认、公有等)。

参数parameterTypes表示:构造器参数的Class类型。如:public Student(String name),Constructor c = clz.getConstructor(String.class)

代码示例:

package com.gbx;public class Student {public Student() {System.out.println("---");}public Student(String name) {System.out.println(name);}public Student(String name, String school) {System.out.println(name + " " + school);}}
package com.gbx;public class Constructors {public static void main(String[] args) throws Exception {//1.加载Class对象Class clazz = Class.forName("com.gbx.Student");//2.获取所有公有构造器System.out.println("****所有公有构造器****");Constructor[] conArray = clazz.getConstructors();for(Constructor c : conArray){System.out.println(c);}//3.获取所有构造器System.out.println("****所有的构造器****");conArray = clazz.getDeclaredConstructors();for(Constructor c : conArray){System.out.println(c);}//3.获取单个公有无参构造器System.out.println("****获取单个公有、无参的构造器****");Constructor con = clazz.getConstructor(null);System.out.println(con);//4.获取单个指定公有构造器System.out.println("****获取单个指定的公有构造器****");con = clazz.getConstructor(String.class);System.out.println(con);//5.获取单个指定构造器System.out.println("****获取单个指定的构造器****");con = clz.getDeclaredConstructor(String.class);System.out.println(con);}}

✨ 2.5、调用构造器创建对象

常用方法: public T newInstance(Object... initargs):使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例,参数initargs:表示调用构造器的实际参数,返回:返回创建的实例,T表示Class所表示类的类型。

提示:如果一个类中的构造器可以直接访问,同时没有参数,那么可以直接使用Class类中的newInstance方法创建对象,public Object newInstance():相当于 new 类名()

代码示例:

 public class newInstances {public static void main(String[] args) throws Exception {//1.加载Class对象Class<Student> clz = Student.class;//2.获取构造器Constructor<Student> c = clz.getConstructor(String.class);//3.调用构造器,创建对象Student stu1 =  c.newInstance("gbx");//直接访问不带参数的构造器可以直接使用Class的newInstance()方法Student stu2 =  clz.newInstance();}}

🚜 2.6、获取类中的成员变量并调用(setAccessible)

  1. 批量获取的方法:

    • Field[] getFields():获取当前Class所表示类的所有"公有字段"。
    • Field[] getDeclaredFields():获取当前Class所表示类的所有字段,包括:私有、受保护、默认、公有。
  2. 获取单个的方法:

    • public Field getField(String fieldName):获取当前Class所表示类的某个"公有的"字段。
    • public Field getDeclaredField(String fieldName):获取当前Class所表示类的某个字段(可以是私有的)。
  3. 设置字段的值:

    • public void set(Object obj,Object value) 参数 obj:要设置的字段所在的对象,value:要为字段设置的值

代码示例:

package com.gbx.field;public class Student {public Student(){}//**字段**//public String name;protected int age;char sex;private String phoneNum;
}
package com.gbx.field;
import java.lang.reflect.Field;
public class Fields {public static void main(String[] args) throws Exception {//1.获取Class对象Class stuClass = Class.forName("com.gbx.field.Student");//2.获取字段System.out.println("***获取所有公有的字段***");Field[] fieldArray = stuClass.getFields();for(Field f : fieldArray){System.out.println(f);}System.out.println("***获取所有的字段(包括私有、受保护、默认)***");fieldArray = stuClass.getDeclaredFields();for(Field f : fieldArray){System.out.println(f);}System.out.println("***获取某个"公有的"字段并设置字段值***");Field f = stuClass.getField("name");System.out.println(f);System.out.println("***获取私有字段并设置字段值***");f = stuClass.getDeclaredField("phoneNum");System.out.println(f);//获取构造器,调用构造器获取一个对象Object obj = stuClass.getConstructor().newInstance();//产生Student对象,相当于Student stu = new Student();//为字段设置值f.set(obj, "张三");//为Student对象中的name属性赋值,相当于stu.name = "张三"//检验Student stu = (Student)obj;System.out.println("姓名:" + stu.name);    f.setAccessible(true);//Student类中的成员变量phoneNum为private,故必须解除“phoneNum”私有限定f.set(obj, "12345678900");System.out.println("电话:" + stu.phoneNum);        }
}

输出:

***获取所有公有的字段***
public java.lang.String com.gbx.field.Student.name
***获取所有的字段(包括私有、受保护、默认的)***
public java.lang.String com.gbx.field.Student.name
protected int com.gbx.field.Student.age
char fanshe.com.gbx.Student.sex
private java.lang.String com.gbx.field.Student.phoneNum
***获取某个“公有的”字段并设置字段值***
public java.lang.String com.gbx.field.Student.name
姓名:张三
***获取私有字段并设置字段值***
private java.lang.String com.gbx.field.Student.phoneNum
电话:12345678900

注:Java反射机制提供的setAccessible()方法,传入true可以取消,Java的安全检查。

👣 2.7、获取类中的成员方法并调用

  1. **批量获取的方法: **

    • public Method[] getMethods():获取当前Class所表示类和继承过来的所有"公有"方法(包含了父类的方法也包含Object类)。
    • public Method[] getDeclaredMethods():获取当前Class所表示类的所有成员方法,包括私有的(不包括继承的,和访问权限无关)。
  2. 获取单个的方法:

    • public Method getMethod(String name,Class<?>... parameterTypes):获取当前Class所表示类的某个"公有"方法(包括继承的)。

    • public Method getDeclaredMethod(String methodName,Class<?>... parameterTypes):获取当前Class所表示类的某个成员方法(不包括继承的)。

      参数 methodName:方法名,Class ... parameterTypes:形参的Class类型对象

  3. 调用方法:

    • public Object invoke(Object obj,Object ... args) 参数 obj:要调用方法的对象,args:调用方法时所传递的实参

代码演示:

package com.gbx.method;public class Student {//****成员方法****//public void show1(String s){System.out.println("调用公有的String参数的show1(): s = " + s);}protected void show2(){System.out.println("调用受保护的无参的show2()");}void show3(){System.out.println("调用默认的无参的show3()");}private String show4(int age){System.out.println("调用私有的且有返回值的int参数的show4(): age = " + age);return age;}
}
package com.gbx.method;import java.lang.reflect.Method;public class MethodClass {public static void main(String[] args) throws Exception {//1.获取Class对象Class stuClass = Class.forName("com.gbx.method.Student");//2.获取所有公有方法System.out.println("****获取所有”公有“方法****");Method[] methodArray = stuClass.getMethods();for(Method m : methodArray){System.out.println(m);}System.out.println("****获取所有本类方法,包括私有****");methodArray = stuClass.getDeclaredMethods();for(Method m : methodArray){System.out.println(m);}System.out.println("****获取公有的show1()方法****");Method m = stuClass.getMethod("show1", String.class);System.out.println(m);//实例化一个Student对象Object obj = stuClass.getConstructor().newInstance();//调用方法,相当于stu.show1("张三")m.invoke(obj, "张三");System.out.println("****获取私有的show4()方法****");m = stuClass.getDeclaredMethod("show4", int.class);System.out.println(m);m.setAccessible(true);//解除私有限定Object result = m.invoke(obj, 20);System.out.println("返回值:" + result);}
}

输入:

****获取所有”公有“方法****
public void com.gbx.method.Student.show1(java.lang.String)
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
****获取所有本类方法,包括私有****
public void com.gbx.method.Student.show1(java.lang.String)
private java.lang.String com.gbx.method.Student.show4(int)
protected void com.gbx.method.Student.show2()
void com.gbx.method.Student.show3()
****获取公有的show1()方法****
public void com.gbx.method.Student.show1(java.lang.String)
调用公有的String参数的show1(): s = 张三
****获取私有的show4()方法****
private java.lang.String com.gbx.method.Student.show4(int)
调用私有的且有返回值的int参数的show4(): age = 20
返回值:20

🐾 2.8、反射方法的其他使用之通过反射运行配置文件内容

Student类:

public class Student {public void show(){System.out.println("It is show()");}
}

配置文件以txt文件为例子(p.txt):

className = com.gbx.Student
methodName = show

代码示例:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Properties;public class Demo {public static void main(String[] args) throws Exception {//通过反射获取Class对象Class stuClass = Class.forName(getValue("className"));//"com.gbx.Student"//2获取show()方法Method m = stuClass.getMethod(getValue("methodName"));//show//3.调用show()方法m.invoke(stuClass.getConstructor().newInstance());        }//此方法接收一个key,在配置文件中获取相应的valuepublic static String getValue(String key) throws IOException{Properties p = new Properties();//获取配置文件的对象FileReader fr = new FileReader("p.txt");//获取字符输入流p.load(fr);//将流加载到配置文件对象中in.close();return p.getProperty(key);//返回根据key获取的value值}
}

优点:当我们升级这个系统时,不要Student类,而需要新写其他类时,这时只需要更改p.txt里的文件内容就可以了,代码不用改动。

🎈 2.9、反射方法的其它使用之越过泛型检查

泛型用在编译期,编译过后泛型擦除(消失),所以是可以通过反射越过泛型检查的。

例如:有一个String泛型的集合,怎样能向这个集合中添加一个Integer类型的值?

代码示例:

import java.lang.reflect.Method;
import java.util.ArrayList;public class Demo {public static void main(String[] args) throws Exception{ArrayList<String> list = new ArrayList<>();list.add("aaa");list.add("bbb");//list.add(100);//获取ArrayList的Class对象,反向的调用add()方法,添加数据Class listClass = list.getClass(); //得到 list对象的字节码对象//获取add()方法Method m = listClass.getMethod("add", Object.class);//调用add()方法m.invoke(list, 100);//遍历集合for(Object obj : list){System.out.println(obj);}}
}

输出:

aaa
bbb
100

这样说明可以通过反射越过泛型检查,向String泛型的集合中添加一个Integer类型的值。

🎁 三、反射面试题

题目:如何在不改变String内存地址的情况下,改变String的内容

正常创建:

@Test
public void test3() {String s = new String("abc"); //堆里面产生sString s1 = s; //s1s = "123";String s2 = s;System.out.println(s1.hashCode() + " " + s2.hashCode() );System.out.println(s1 == s2);
}
/**
*   结果:
*		96354 48690
*		false
*/

图示:image-20230816211624614

通过反射操作String中的value属性:

@Test
public void test4() throws Exception {String s = new String("123"); //堆里面产生sString s1 = s; //s1Field vf = String.class.getDeclaredField("value");vf.setAccessible(true);char[] chars = {97, 98, 99};vf.set(s, chars);String s2 = s;System.out.println(s1.hashCode() + " " + s2.hashCode() );System.out.println(s1 == s2);/***	结果:*		96354 96354*		true**/
}

图示:image-20230816211924957

相关文章:

⛳ Java 反射

目录 ⛳ Java 反射&#x1f3a8; 一、反射概述**&#x1f383; 使用反射的前提条件: **&#x1f3b2; 类正常加载过程如下图&#xff1a;反射优缺点&#xff1a;&#x1f9f8; Java反射机制提供的功能: **&#x1f945; 反射主要API** &#x1f3ed; 二、反射的使用&#x1f3a…...

Android 13 像Settings一样开启关闭深色模式

一.背景 由于客户定制的Settings需要开启关闭深色模式,所以需要自己调用开启关闭深色模式 二.前提条件 首先应用肯定要是系统应用,并且导入framework.jar包,具体可以参考: Android 应用自动开启辅助(无障碍)功能并使用辅助(无障碍)功能_android 自动开启无障碍服务_龚礼鹏…...

微服务实战项目-学成在线-项目优化(redis缓存优化)

微服务实战项目-学成在线-项目优化(redis缓存优化) 1 优化需求 视频播放页面用户未登录也可以访问&#xff0c;当用户观看试学课程时需要请求服务端查询数据&#xff0c;接口如下&#xff1a; 1、根据课程id查询课程信息。 2、根据文件id查询视频信息。 这些接口在用户未认…...

IDEA 找不到项目 ‘org.springframework.boot:spring-boot-starter-parent:3.1.2‘

找不到项目 ‘org.springframework.boot:spring-boot-starter-parent:2.6.7’ 这个问题主要是因为ide的缓存导致的&#xff0c;我们直接清理缓存并重启ide 重启之后ide会对pom文件进行编排索引完成之后问题就没有了...

thinkphp开发的在线学习培训考试模拟考试做题练习系统带商城功能证书管理课程系统

thinkphp开发的在线学习培训考试模拟考试做题练习系统带商城功能证书管理课程系统 1、做题界面 2、前端UI的展示 3、带商城购物功能...

Android 应用冷启动优化

冷启动相关概念 应用启动概念 冷启动&#xff1a;首次打开app或者app彻底销毁后再次打开app&#xff08;开关机后&#xff09;&#xff0c;这也是我们进行启动速度优化的主要方向。热启动&#xff1a;应用运行中按home键再打开应用。温启动&#xff1a;介于两者之间&#xff…...

538页21万字数字政府智慧政务大数据云平台项目建设方案WORD

导读&#xff1a;原文《538页21万字数字政府智慧政务大数据云平台项目建设方案WORD》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 根据业务的不同属性&#xff0c…...

进程间通信——信号

信号的概念 信号是 Linux进程间通信的最古老的方式之一&#xff0c;是事件发生时对进程的通知机制&#xff0c;有时也称之为软件中断&#xff0c;它是在软件层次上对中断机制的一种模拟&#xff0c;是一种异步通信的方式。信号可以导致一个正在运行的进程被另一个正在运行的异…...

PAT 1039 Course List for Student

个人学习记录&#xff0c;代码难免不尽人意。 Zhejiang University has 40000 students and provides 2500 courses. Now given the student name lists of all the courses, you are supposed to output the registered course list for each student who comes for a query. …...

【Sklearn】基于决策树算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于决策树算法的数据分类预测(Excel可直接替换数据) 1.模型原理1.1 模型原理1.2 数学模型2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果1.模型原理 决策树是一种基于树状结构的分类和回归模型,它通过一系列的决策规则来将数据划分为不同的类…...

并发编程4:Java 中的并发基础构建模块

目录 1、同步容器类 1.1 - 同步容器类的问题 1.2 - 迭代和容器加锁 2、并发容器类 2.1 - ConcurrentHashMap 类 2.2 - CopyOnWriteArrayList 类 3、阻塞队列和生产者-消费者模式 3.1 - 串行线程封闭 4、阻塞方法与中断方法 5、同步工具类 5.1 - 闭锁 -> CountDow…...

Vue-10.集成(.editorconfig、.eslintrc.js、.prettierrc)

介绍 同时使用 .editorconfig、.prettierrc 和 .eslintrc.js 是很常见的做法&#xff0c;因为它们可以在不同层面上帮助确保代码的格式一致性和质量。这种组合可以在开发过程中提供全面的代码维护和质量保证。然而&#xff0c;这也可能增加一些复杂性&#xff0c;需要谨慎配置…...

PHP-FPM进程排查

1、查看php-fpm的进程个数 ps -ef |grep "php-fpm"|grep "pool"|wc -l2、查看每个php-fpm占用的内存大小 ps -ylC php-fpm --sort:rss3.查看PHP-FPM在你的机器上的平均内存占用 ps --no-headers -o "rss,cmd" -C php-fpm | awk { sum$1 } END…...

PHP-MD5注入

0x00 前言 有些零散的知识未曾关注过&#xff0c;偶然捡起反而更加欢喜。 0x01 md5 注入绕过 md5函数有两个参数&#xff0c;第一个参数是要进行md5的值&#xff0c;第二个值默认为false&#xff0c;如果为true则返回16位原始二进制格式的字符串。意思就是会将md5后的结果当…...

对redis、redisson、springcache总结

<一> redis-缓存中间件 什么是redis redis是c语言开发的&#xff0c;一个高性能key-value键值对内存数据库&#xff0c;可以用来做数据库、缓存、消息中间件的一种非关系型数据库。 redis数据存储在哪里 内存和磁盘中&#xff0c;但是redis的读写都在内存中&#xff0c;…...

Java基础知识实际应用(学生信息管理系统、猜拳小游戏、打印日历)

一、Java学生信息管理系统 这个系统包含了添加、修改、删除、查询和显示所有学生信息等功能。您可以在此基础上进行修改和完善&#xff0c;以适应您的需求。 import java.util.Scanner;public class StudentManagementSystem {private static Scanner scanner new Scanner(S…...

Git:在本地电脑上如何使用git?

git 版本&#xff1a; 2.40.1.windows.1 文章目录 一. 使用git之前你必须要理解的几个概念1.1 理解工作区、版本库、暂存区的概念1.2 提交Git版本库的步骤【分两步执行】 二. Git本地库实战2.1 初始化版本库2.2 新建 & 提交 & 状态2.3 查看日志2.4 回退 & 穿梭 &am…...

卷和分区的关系

1、分区 存储空间管理和仓库管理类似&#xff0c;只不过仓库管理的是货物&#xff0c;存储空间管理的是文件。当仓库规模小时&#xff0c;可以不划分货物的存放区域&#xff0c;但当仓库规模很大&#xff0c;就必须根据货物的类型和存储需要&#xff0c;把仓库分为多个区域。例…...

Linux下在qtcreator中创建qt程序

目录 1、新建项目 2、单工程项目创建 3、多工程项目创建 4、添加子工程&#xff08;基于多工程目录结构&#xff09; 5、 .pro文件 1、新建项目 切换到“编辑”界面&#xff0c;点击菜单栏中的“文件”-“新建文件或项目” 2、单工程项目创建 只有一个工程的项目&#…...

快递再多也不怕!你的顺丰快递用上5G“神器”

互联网时代&#xff0c;剁手党疯狂“买买买”之后&#xff0c;快递件量再创新高。《2023年6月中国快递发展指数报告》显示&#xff0c;2023二季度单月快递业务量稳定在百亿件以上。其中&#xff0c;由于“618”电商促销活动与父亲节叠加&#xff0c;6月16日至20日单日揽收量均超…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...