詳細講解Java中的反射和經典面試題(保姆級別)

1.1 反射的概述:

專業的解釋(了解一下):

是在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;

對于任意一個對象,都能夠調用它的任意屬性和方法;

這種動態獲取信息以及動態調用對象方法的功能稱為Java語言的反射機制。

通俗的理解:(掌握)

  • 利用反射創建的對象可以無視修飾符調用類里面的內容
  • 可以跟配置文件結合起來使用,把要創建的對象信息和方法寫在配置文件中。

讀取到什么類,就創建什么類的對象

讀取到什么方法,就調用什么方法

此時當需求變更的時候不需要修改代碼,只要修改配置文件即可。

1.2 學習反射到底學什么?

反射都是從class字節碼文件中獲取的內容。

  • 如何獲取class字節碼文件的對象
  • 利用反射如何獲取構造方法(創建對象)
  • 利用反射如何獲取成員變量(賦值,獲取值)
  • 利用反射如何獲取成員方法(運行)

1.3 獲取字節碼文件對象的三種方式

  • Class這個類里面的靜態方法forName(“全類名”)(最常用)
  • 通過class屬性獲取
  • 通過對象獲取字節碼文件對象

代碼示例:

//1.Class這個類里面的靜態方法forName//Class.forName("類的全類名"): 全類名 = 包名 + 類名Class clazz1 = Class.forName("com.itheima.reflectdemo.Student");//源代碼階段獲取 --- 先把Student加載到內存中,再獲取字節碼文件的對象//clazz 就表示Student這個類的字節碼文件對象。//就是當Student.class這個文件加載到內存之后,產生的字節碼文件對象//2.通過class屬性獲取//類名.classClass clazz2 = Student.class;//因為class文件在硬盤中是唯一的,所以,當這個文件加載到內存之后產生的對象也是唯一的System.out.println(clazz1 == clazz2);//true//3.通過Student對象獲取字節碼文件對象Student s = new Student();Class clazz3 = s.getClass();System.out.println(clazz1 == clazz2);//trueSystem.out.println(clazz2 == clazz3);//true

1.4 字節碼文件和字節碼文件對象

java文件:就是我們自己編寫的java代碼。

字節碼文件:就是通過java文件編譯之后的class文件(是在硬盤上真實存在的,用眼睛能看到的)

字節碼文件對象:當class文件加載到內存之后,虛擬機自動創建出來的對象。

這個對象里面至少包含了:構造方法,成員變量,成員方法。

而我們的反射獲取的是什么?字節碼文件對象,這個對象在內存中是唯一的。

1.5 獲取構造方法

規則:

get表示獲取

Declared表示私有

最后的s表示所有,復數形式

如果當前獲取到的是私有的,必須要臨時修改訪問權限,否則無法使用

方法名

說明

Constructor<?>[] getConstructors()

獲得所有的構造(只能public修飾)

Constructor<?>[] getDeclaredConstructors()

獲得所有的構造(包含private修飾)

Constructor<T> getConstructor(Class<?>... parameterTypes)

獲取指定構造(只能public修飾)

Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)

獲取指定構造(包含private修飾)

代碼示例:

public class ReflectDemo2 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {//1.獲得整體(class字節碼文件對象)Class clazz = Class.forName("com.itheima.reflectdemo.Student");//2.獲取構造方法對象//獲取所有構造方法(public)Constructor[] constructors1 = clazz.getConstructors();for (Constructor constructor : constructors1) {System.out.println(constructor);}System.out.println("=======================");//獲取所有構造(帶私有的)Constructor[] constructors2 = clazz.getDeclaredConstructors();for (Constructor constructor : constructors2) {System.out.println(constructor);}System.out.println("=======================");//獲取指定的空參構造Constructor con1 = clazz.getConstructor();System.out.println(con1);Constructor con2 = clazz.getConstructor(String.class,int.class);System.out.println(con2);System.out.println("=======================");//獲取指定的構造(所有構造都可以獲取到,包括public包括private)Constructor con3 = clazz.getDeclaredConstructor();System.out.println(con3);//了解 System.out.println(con3 == con1);//每一次獲取構造方法對象的時候,都會新new一個。Constructor con4 = clazz.getDeclaredConstructor(String.class);System.out.println(con4);}}

1.6 獲取構造方法并創建對象

涉及到的方法:newInstance

代碼示例:

//首先要有一個javabean類public class Student {private String name;private int age;public Student() {}public Student(String name) {this.name = name;}private Student(String name, int age) {this.name = name;this.age = age;}/*** 獲取* @return name*/public String getName() {return name;}/*** 設置* @param name*/public void setName(String name) {this.name = name;}/*** 獲取* @return age*/public int getAge() {return age;}/*** 設置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}}//測試類中的代碼://需求1://獲取空參,并創建對象//1.獲取整體的字節碼文件對象Class clazz = Class.forName("com.itheima.a02reflectdemo1.Student");//2.獲取空參的構造方法Constructor con = clazz.getConstructor();//3.利用空參構造方法創建對象Student stu = (Student) con.newInstance();System.out.println(stu);System.out.println("=============================================");//測試類中的代碼://需求2://獲取帶參構造,并創建對象//1.獲取整體的字節碼文件對象Class clazz = Class.forName("com.itheima.a02reflectdemo1.Student");//2.獲取有參構造方法Constructor con = clazz.getDeclaredConstructor(String.class, int.class);//3.臨時修改構造方法的訪問權限(暴力反射)con.setAccessible(true);//4.直接創建對象Student stu = (Student) con.newInstance("zhangsan", 23);System.out.println(stu);

1.7 獲取成員變量

規則:

get表示獲取

Declared表示私有

最后的s表示所有,復數形式

如果當前獲取到的是私有的,必須要臨時修改訪問權限,否則無法使用

方法名:

方法名

說明

Field[] getFields()

返回所有成員變量對象的數組(只能拿public的)

Field[] getDeclaredFields()

返回所有成員變量對象的數組,存在就能拿到

Field getField(String name)

返回單個成員變量對象(只能拿public的)

Field getDeclaredField(String name)

返回單個成員變量對象,存在就能拿到

代碼示例:

public class ReflectDemo4 {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {//獲取成員變量對象//1.獲取class對象Class clazz = Class.forName("com.itheima.reflectdemo.Student");//2.獲取成員變量的對象(Field對象)只能獲取public修飾的Field[] fields1 = clazz.getFields();for (Field field : fields1) {System.out.println(field);}System.out.println("===============================");//獲取成員變量的對象(public + private)Field[] fields2 = clazz.getDeclaredFields();for (Field field : fields2) {System.out.println(field);}System.out.println("===============================");//獲得單個成員變量對象//如果獲取的屬性是不存在的,那么會報異常//Field field3 = clazz.getField("aaa");//System.out.println(field3);//NoSuchFieldExceptionField field4 = clazz.getField("gender");System.out.println(field4);System.out.println("===============================");//獲取單個成員變量(私有)Field field5 = clazz.getDeclaredField("name");System.out.println(field5);}}public class Student {private String name;private int age;public String gender;public String address;public Student() {}public Student(String name, int age, String address) {this.name = name;this.age = age;this.address = address;}public Student(String name, int age, String gender, String address) {this.name = name;this.age = age;this.gender = gender;this.address = address;}/*** 獲取* @return name*/public String getName() {return name;}/*** 設置* @param name*/public void setName(String name) {this.name = name;}/*** 獲取* @return age*/public int getAge() {return age;}/*** 設置* @param age*/public void setAge(int age) {this.age = age;}/*** 獲取* @return gender*/public String getGender() {return gender;}/*** 設置* @param gender*/public void setGender(String gender) {this.gender = gender;}/*** 獲取* @return address*/public String getAddress() {return address;}/*** 設置* @param address*/public void setAddress(String address) {this.address = address;}public String toString() {return "Student{name = " + name + ", age = " + age + ", gender = " + gender + ", address = " + address + "}";}}

1.8 獲取成員變量并獲取值和修改值

方法

說明

void set(Object obj, Object value)

賦值

Object get(Object obj)

獲取值

代碼示例:

public class ReflectDemo5 {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {Student s = new Student("zhangsan",23,"廣州");Student ss = new Student("lisi",24,"北京");//需求://利用反射獲取成員變量并獲取值和修改值//1.獲取class對象Class clazz = Class.forName("com.itheima.reflectdemo.Student");//2.獲取name成員變量//field就表示name這個屬性的對象Field field = clazz.getDeclaredField("name");//臨時修飾他的訪問權限field.setAccessible(true);//3.設置(修改)name的值//參數一:表示要修改哪個對象的name?//參數二:表示要修改為多少?field.set(s,"wangwu");//3.獲取name的值//表示我要獲取這個對象的name的值String result = (String)field.get(s);//4.打印結果System.out.println(result);System.out.println(s);System.out.println(ss);}}public class Student {private String name;private int age;public String gender;public String address;public Student() {}public Student(String name, int age, String address) {this.name = name;this.age = age;this.address = address;}public Student(String name, int age, String gender, String address) {this.name = name;this.age = age;this.gender = gender;this.address = address;}/*** 獲取* @return name*/public String getName() {return name;}/*** 設置* @param name*/public void setName(String name) {this.name = name;}/*** 獲取* @return age*/public int getAge() {return age;}/*** 設置* @param age*/public void setAge(int age) {this.age = age;}/*** 獲取* @return gender*/public String getGender() {return gender;}/*** 設置* @param gender*/public void setGender(String gender) {this.gender = gender;}/*** 獲取* @return address*/public String getAddress() {return address;}/*** 設置* @param address*/public void setAddress(String address) {this.address = address;}public String toString() {return "Student{name = " + name + ", age = " + age + ", gender = " + gender + ", address = " + address + "}";}}

1.9 獲取成員方法

規則:

get表示獲取

Declared表示私有

最后的s表示所有,復數形式

如果當前獲取到的是私有的,必須要臨時修改訪問權限,否則無法使用

方法名

說明

Method[] getMethods()

返回所有成員方法對象的數組(只能拿public的)

Method[] getDeclaredMethods()

返回所有成員方法對象的數組,存在就能拿到

Method getMethod(String name, Class<?>... parameterTypes)

返回單個成員方法對象(只能拿public的)

Method getDeclaredMethod(String name, Class<?>... parameterTypes)

返回單個成員方法對象,存在就能拿到

代碼示例:

public class ReflectDemo6 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {//1.獲取class對象Class<?> clazz = Class.forName("com.itheima.reflectdemo.Student");//2.獲取方法//getMethods可以獲取父類中public修飾的方法Method[] methods1 = clazz.getMethods();for (Method method : methods1) {System.out.println(method);}System.out.println("===========================");//獲取所有的方法(包含私有)//但是只能獲取自己類中的方法Method[] methods2 = clazz.getDeclaredMethods();for (Method method : methods2) {System.out.println(method);}System.out.println("===========================");//獲取指定的方法(空參)Method method3 = clazz.getMethod("sleep");System.out.println(method3);Method method4 = clazz.getMethod("eat",String.class);System.out.println(method4);//獲取指定的私有方法Method method5 = clazz.getDeclaredMethod("playGame");System.out.println(method5);}}

1.10 獲取成員方法并運行

方法

Object invoke(Object obj, Object... args) :運行方法

參數一:用obj對象調用該方法

參數二:調用方法的傳遞的參數(如果沒有就不寫)

返回值:方法的返回值(如果沒有就不寫)

代碼示例:

package com.itheima.a02reflectdemo1;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class ReflectDemo6 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {//1.獲取字節碼文件對象Class clazz = Class.forName("com.itheima.a02reflectdemo1.Student");//2.獲取一個對象//需要用這個對象去調用方法Student s = new Student();//3.獲取一個指定的方法//參數一:方法名//參數二:參數列表,如果沒有可以不寫Method eatMethod = clazz.getMethod("eat",String.class);//運行//參數一:表示方法的調用對象//參數二:方法在運行時需要的實際參數//注意點:如果方法有返回值,那么需要接收invoke的結果//如果方法沒有返回值,則不需要接收String result = (String) eatMethod.invoke(s, "重慶小面");System.out.println(result);}}public class Student {private String name;private int age;public String gender;public String address;public Student() {}public Student(String name) {this.name = name;}private Student(String name, int age) {this.name = name;this.age = age;}/*** 獲取* @return name*/public String getName() {return name;}/*** 設置* @param name*/public void setName(String name) {this.name = name;}/*** 獲取* @return age*/public int getAge() {return age;}/*** 設置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}private void study(){System.out.println("學生在學習");}private void sleep(){System.out.println("學生在睡覺");}public String eat(String something){System.out.println("學生在吃" + something);return "學生已經吃完了,非常happy";}}

面試題:

你覺得反射好不好?好,有兩個方向

第一個方向:無視修飾符訪問類中的內容。但是這種操作在開發中一般不用,都是框架底層來用的。

第二個方向:反射可以跟配置文件結合起來使用,動態的創建對象,動態的調用方法。

1.11 練習泛型擦除(掌握概念,了解代碼)

理解:(掌握)

集合中的泛型只在java文件中存在,當編譯成class文件之后,就沒有泛型了。

代碼示例:(了解)

package com.itheima.reflectdemo;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;public class ReflectDemo8 {public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {//1.創建集合對象ArrayList<Integer> list = new ArrayList<>();list.add(123);//        list.add("aaa");//2.利用反射運行add方法去添加字符串//因為反射使用的是class字節碼文件//獲取class對象Class clazz = list.getClass();//獲取add方法對象Method method = clazz.getMethod("add", Object.class);//運行方法method.invoke(list,"aaa");//打印集合System.out.println(list);}}

1.12 練習:修改字符串的內容(掌握概念,了解代碼)

在這個練習中,我需要你掌握的是字符串不能修改的真正原因。

字符串,在底層是一個byte類型的字節數組,名字叫做value

private final byte[] value;

真正不能被修改的原因:final和private

final修飾value表示value記錄的地址值不能修改。

private修飾value而且沒有對外提供getvalue和setvalue的方法。所以,在外界不能獲取或修改value記錄的地址值。

如果要強行修改可以用反射:

代碼示例:(了解)

String s = "abc";String ss = "abc";// private final byte[] value= {97,98,99};// 沒有對外提供getvalue和setvalue的方法,不能修改value記錄的地址值// 如果我們利用反射獲取了value的地址值。// 也是可以修改的,final修飾的value// 真正不可變的value數組的地址值,里面的內容利用反射還是可以修改的,比較危險//1.獲取class對象Class clazz = s.getClass();//2.獲取value成員變量(private)Field field = clazz.getDeclaredField("value");//但是這種操作非常危險//JDK高版本已經屏蔽了這種操作,低版本還是可以的//臨時修改權限field.setAccessible(true);//3.獲取value記錄的地址值byte[] bytes = (byte[]) field.get(s);bytes[0] = 100;System.out.println(s);//dbcSystem.out.println(ss);//dbc

1.13 練習,反射和配置文件結合動態獲取的練習(重點)

需求: 利用反射根據文件中的不同類名和方法名,創建不同的對象并調用方法。

分析:

①通過Properties加載配置文件

②得到類名和方法名

③通過類名反射得到Class對象

④通過Class對象創建一個對象

⑤通過Class對象得到方法

⑥調用方法

代碼示例:

public class ReflectDemo9 {public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {//1.讀取配置文件的信息Properties prop = new Properties();FileInputStream fis = new FileInputStream("day14-code\\prop.properties");prop.load(fis);fis.close();System.out.println(prop);String classname = prop.get("classname") + "";String methodname = prop.get("methodname") + "";//2.獲取字節碼文件對象Class clazz = Class.forName(classname);//3.要先創建這個類的對象Constructor con = clazz.getDeclaredConstructor();con.setAccessible(true);Object o = con.newInstance();System.out.println(o);//4.獲取方法的對象Method method = clazz.getDeclaredMethod(methodname);method.setAccessible(true);//5.運行方法method.invoke(o);}}配置文件中的信息:classname=com.itheima.a02reflectdemo1.Studentmethodname=sleep

1.14 利用發射保存對象中的信息(重點)

public class MyReflectDemo {public static void main(String[] args) throws IllegalAccessException, IOException {/*對于任意一個對象,都可以把對象所有的字段名和值,保存到文件中去*/Student s = new Student("小A",23,'女',167.5,"睡覺");Teacher t = new Teacher("播妞",10000);saveObject(s);}//把對象里面所有的成員變量名和值保存到本地文件中public static void saveObject(Object obj) throws IllegalAccessException, IOException {//1.獲取字節碼文件的對象Class clazz = obj.getClass();//2. 創建IO流BufferedWriter bw = new BufferedWriter(new FileWriter("myreflect\\a.txt"));//3. 獲取所有的成員變量Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {field.setAccessible(true);//獲取成員變量的名字String name = field.getName();//獲取成員變量的值Object value = field.get(obj);//寫出數據bw.write(name + "=" + value);bw.newLine();}bw.close();}}
public class Student {private String name;private int age;private char gender;private double height;private String hobby;public Student() {}public Student(String name, int age, char gender, double height, String hobby) {this.name = name;this.age = age;this.gender = gender;this.height = height;this.hobby = hobby;}/*** 獲取* @return name*/public String getName() {return name;}/*** 設置* @param name*/public void setName(String name) {this.name = name;}/*** 獲取* @return age*/public int getAge() {return age;}/*** 設置* @param age*/public void setAge(int age) {this.age = age;}/*** 獲取* @return gender*/public char getGender() {return gender;}/*** 設置* @param gender*/public void setGender(char gender) {this.gender = gender;}/*** 獲取* @return height*/public double getHeight() {return height;}/*** 設置* @param height*/public void setHeight(double height) {this.height = height;}/*** 獲取* @return hobby*/public String getHobby() {return hobby;}/*** 設置* @param hobby*/public void setHobby(String hobby) {this.hobby = hobby;}public String toString() {return "Student{name = " + name + ", age = " + age + ", gender = " + gender + ", height = " + height + ", hobby = " + hobby + "}";}}
public class Teacher {private String name;private double salary;public Teacher() {}public Teacher(String name, double salary) {this.name = name;this.salary = salary;}/*** 獲取* @return name*/public String getName() {return name;}/*** 設置* @param name*/public void setName(String name) {this.name = name;}/*** 獲取* @return salary*/public double getSalary() {return salary;}/*** 設置* @param salary*/public void setSalary(double salary) {this.salary = salary;}public String toString() {return "Teacher{name = " + name + ", salary = " + salary + "}";}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919675.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919675.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919675.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MyCAT完整實驗報告

MyCAT完整實驗報告 ? 前言 剛剛看了一下前面的那篇MyCAT的文章 感覺有一些問題 所以拿出一篇文章再說一下 單獨構建了完整的實驗環境 這樣會全面一點 ? 安裝MyCAT #跳過? 主從配置 #不多追溯 因為我們選擇的主從 也可以做雙主機 但我們后邊再說? 環境搭建 一、環境規劃 服務…

機器翻譯論文閱讀方法:頂會(ACL、EMNLP)論文解析技巧

更多內容請見: 機器翻譯修煉-專欄介紹和目錄 文章目錄 一、論文選擇:快速判斷論文價值 1.1 關注核心會議與子領域 1.2 篩選標準 1.3 預讀篩選 1.4 快速定位關鍵信息 二、精讀解析 2.1 問題定義(5分鐘) 2.2 方法解剖(15分鐘) 2.3 實驗深挖(20分鐘) 2.4 批判性思考(10分…

Transformer模型實戰篇

引入 基于Transformers的NLP解決方案的步驟如下&#xff1a;&#xff08;以文本分類為例&#xff09; 導入相關包&#xff0c;General&#xff0c;可以詢問ai需要導什么包加載數據集&#xff0c;Data_loader&#xff0c;Datasets數據集劃分&#xff0c;測試機&#xff0c;驗證集…

深入(流批【牛批】框架)Flink的機制

flink本身是專注有狀態的無限流處理&#xff0c;有限流處理【batch批次】是無限流處理的一中特殊情況&#xff01;應用場景實時ETL 集成流計算現有的諸多數據通道和SQL靈活的加工能力&#xff0c;對流式數據進行實時清洗、歸并和結構化 處理&#xff1b;同時&#xff0c;對離線…

Git 2.15.0 64位安裝步驟Windows詳細教程從下載到驗證(附安裝包下載)

一、下載后雙擊運行 安裝包下載&#xff1a;https://pan.quark.cn/s/7200b32a1ecf&#xff0c;找到下載好的文件&#xff1a;?Git-2.15.0-64-bit.exe?雙擊這個文件&#xff0c;就會彈出安裝向導窗口&#xff0c;點 ??“Next”&#xff08;下一步&#xff09;?? 二、選擇…

在職老D滲透日記day23:sqli-labs靶場通關(第29關-31關)http參數過濾

5.29.第29關 http參數過濾 閉合5.29.1.手動注入&#xff08;1&#xff09;判斷注入類型、注入點閉合&#xff08;2&#xff09;有回顯&#xff0c;優先用聯合查詢注入&#xff0c;判讀字段數?id1&id2 order by 3 -- ?id1&id2 order by 4 --&#xff08;3&#xff09;…

Spring Boot整合Amazon SNS實戰:郵件訂閱通知系統開發

Spring Boot整合Amazon SNS實戰引言配置服務總結新用戶可獲得高達 200 美元的服務抵扣金 亞馬遜云科技新用戶可以免費使用亞馬遜云科技免費套餐&#xff08;Amazon Free Tier&#xff09;。注冊即可獲得 100 美元的服務抵扣金&#xff0c;在探索關鍵亞馬遜云科技服務時可以再額…

LeetCode_動態規劃1

動態規劃1.動態規劃總結1.1 01背1.1.1 二維數組1.1.2 一維數組1.2 完全背包2.斐波那契數(力扣509)3.爬樓梯(力扣70)4.使用最小花費爬樓梯(力扣746)5.不同路徑(力扣62)6.不同路徑 II(力扣63)7.整數拆分(力扣343)8.不同的二叉搜索樹(力扣96)9.分割等和子集(力扣416)10.最后一塊石…

【STM32】HAL庫中的實現(九):SPI(串行外設接口)

SPI 接口通信原理 SPI&#xff08;Serial Peripheral Interface&#xff09;是全雙工主從通信協議&#xff0c;特點是&#xff1a; 信號線功能SCK串行時鐘MOSI主設備輸出&#xff0c;從設備輸入MISO主設備輸入&#xff0c;從設備輸出CS&#xff08;NSS&#xff09;片選信號&am…

Git常用操作大全(附git操作命令)

Git常用操作大全 一、基礎配置 1.1 設置用戶名和郵箱 git config --global user.name "你的名字" git config --global user.email "你的郵箱"1.2 查看配置 git config --list二、倉庫管理 2.1 初始化本地倉庫 git init2.2 克隆遠程倉庫 git clone <倉庫…

詳解flink table api基礎(三)

文章目錄1.使用flink的原因&#xff1a;2. Flink支持兩種模式&#xff1a;3. flink table api工作原理&#xff1a;4. Flink table api 使用5. select語句&flink table api&#xff1a;6. 使用flink table api 創建table7. 使用flink table api 寫流式數據輸出到表或sink8.…

Vue2+Vue3前端開發_Day5

參考課程: 【黑馬程序員 Vue2Vue3基礎入門到實戰項目】 [https://www.bilibili.com/video/BV1HV4y1a7n4] ZZHow(ZZHow1024) 自定義指令 基本語法&#xff08;全局 & 局部注冊&#xff09; 介紹&#xff1a;自己定義的指令&#xff0c;可以封裝一些 DOM 操作&#xff0c…

機器學習--決策樹2

目錄 第一代裁判&#xff1a;ID3 與信息增益的 “偏愛” 第二代裁判&#xff1a;C4.5 用 “增益率” 找平衡 第三代裁判&#xff1a;CART 的 “基尼指數” 新思路 遇到連續值&#xff1f;先 “砍幾刀” 再說 給決策樹 “減肥”&#xff1a;剪枝的學問 動手試試&#xff1…

yggjs_react使用教程 v0.1.1

yggjs_react是一個用于快速創建React項目的工具&#xff0c;它集成了Vite、TypeScript、Zustand和React Router等現代前端技術棧&#xff0c;幫助開發者快速搭建高質量的React應用。 快速入門 快速入門部分將指導您如何安裝yggjs_react工具、創建新項目并啟動開發服務器。 安…

vulhub可用的docker源

這一塊不太容易找&#xff0c;我試了好幾個源&#xff0c;下面是20250820測試可用源 編輯方法sudo mkdir -p /etc/docker sudo vim /etc/docker/daemon.json 配置內容 [1] {"registry-mirrors" : ["https://docker.registry.cyou", "https://docker-…

基于YOLOv8-SEAttention與LLMs融合的農作物害蟲智能診斷與防控決策系統

1. 引言 1.1 研究背景與意義 農作物蟲害是制約農業產量與質量的重要因素。據FAO報告&#xff0c;全球每年因病蟲害造成的糧食損失高達 20%–40%。傳統人工巡查與經驗診斷具有時效性差、成本高與專業人才不足等缺陷。近年來&#xff0c;計算機視覺特別是目標檢測技術在農業檢測…

從零開始構建GraphRAG紅樓夢知識圖譜問答項目(三)

文章結尾有CSDN官方提供的學長的聯系方式&#xff01;&#xff01; 歡迎關注B站從零開始構建一個基于GraphRAG的紅樓夢項目 第三集01 搭建后端服務 創建一個python文件server.py 完整源碼放到文章最后了。 1.1 graphrag 相關導入 # GraphRAG 相關導入 from graphrag.query.cont…

S32K328(Arm Cortex-M7)適配CmBacktrace錯誤追蹤

CmBacktrace 相當于重寫了hard_fault函數&#xff0c;在hard_fault函數里面去分析SCB寄存器的信息和堆棧信息&#xff0c;然后把這些信息打印出來(或者寫到flash)&#xff1b;通過使用串口輸出產生hard_fault的堆棧信息&#xff0c;然后利用addr2line工具反推出具體的代碼執行函…

AI研究引擎的簡單技術實現步驟

產品愿景與核心功能 1.1 產品使命 “洞見 Weaver”是一個全棧AI Web應用,旨在將用戶的復雜研究問題,通過AI驅動的動態思維導圖和結構化報告,轉化為一次沉浸式的、可追溯的視覺探索之旅。我們的使命是,將AI復雜的推理過程透明化,將人類的探索直覺與AI的分析能力無縫結合,…

open webui源碼分析5-Tools

本文從最簡單的時間工具入手&#xff0c;分析Tools相關的代碼。一、安裝工具git clone https://github.com/open-webui/openapi-servers cd openapi-servers# 進入時間工具目錄 cd servers/timepip install -r requirements.txt# 啟動服務 uvicorn main:app --host 0.0.0.0 --r…