Java基礎關鍵_032_反射(二)

目? 錄

一、反射 Class 的 Method

1.反編譯?String 類的方法簽名

2.通過反射調用方法

3.反編譯 String 類的構造方法簽名

4.通過反射調用構造方法

?二、類加載過程

1.裝載(Loading)

(1)說明

(2)雙親委派機制

2.鏈接(Linking)?

(1)驗證(Verify)

(2)準備(Prepare)?

(3)解析(Resolve)

3.初始化(initialization)?

三、類加載器獲取 Class

1.說明

2.與 Class.forName() 比較

?四、反射的泛型

1.父類的泛型

2.接口的泛型?

3.屬性的泛型

4.方法參數的泛型

5.方法返回值的泛型

6.構造方法參數的泛型


一、反射 Class 的 Method

1.反編譯?String 類的方法簽名

public class MethodTest {public static void main(String[] args) throws ClassNotFoundException {// 獲取類信息Class<?> aClass = Class.forName("java.lang.String");// 獲取類修飾符String classMod = Modifier.toString(aClass.getModifiers());// 獲取簡單類名String className = aClass.getSimpleName();// 獲取簡單父類名String classSupName = aClass.getSuperclass().getSimpleName();// 獲取父類接口Class<?>[] classInterfaces = aClass.getInterfaces();// 獲取所有方法Method[] declaredMethods = aClass.getDeclaredMethods();// 字符串拼接StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(classMod);stringBuilder.append(" class ");stringBuilder.append(className);stringBuilder.append(" extends ");stringBuilder.append(classSupName);if (classInterfaces.length > 0) {stringBuilder.append(" implements ");for (int i = 0; i < classInterfaces.length; i++) {stringBuilder.append(classInterfaces[i].getSimpleName());if (i != classInterfaces.length - 1) {stringBuilder.append(", ");}}}stringBuilder.append(" {\n");for (Method declaredMethod : declaredMethods) {stringBuilder.append("\t");// 獲取方法修飾符String methodMod = Modifier.toString(declaredMethod.getModifiers());stringBuilder.append(methodMod);stringBuilder.append(" ");// 獲取方法返回值類型Class<?> returnType = declaredMethod.getReturnType();stringBuilder.append(returnType.getSimpleName());stringBuilder.append(" ");// 獲取方法名String methodName = declaredMethod.getName();stringBuilder.append(methodName);// 獲取方法參數類型stringBuilder.append(" (");Parameter[] parameters = declaredMethod.getParameters();for (int i = 0; i < parameters.length; i++) {Parameter parameter = parameters[i];// 獲取參數類型Class<?> parType = parameter.getType();stringBuilder.append(parType.getSimpleName());// 獲取參數名String parName = parameter.getName();stringBuilder.append(" ");stringBuilder.append(parName);// 添加逗號分隔符,最后一個參數不加逗號if (i < parameters.length - 1) {stringBuilder.append(", ");}}stringBuilder.append(") {}\n");}stringBuilder.append("}");System.out.println(stringBuilder);}
}


2.通過反射調用方法

  1. ?四要素:對象、方法、參數、值。缺一不可;
  2. 若方法不是 public 的,運行會報【java.lang.IllegalAccessException】異常,需要通過 setAccessible(true) 打破封裝;
public class Person {public String name;private int age;protected String sex;public static String country;public static final String job = "程序員";public Person() {}public Person(String name, int age, String sex) {this.name = name;this.age = age;this.sex = sex;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public static String getCountry() {return country;}public static void setCountry(String country) {Person.country = country;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", sex='" + sex + '\'' +'}';}private void test(String s) {System.out.println("test(" + s + ")方法執行完畢!");}
}
public class UseMethod {public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {Person person = new Person();Class<? extends Person> aClass = person.getClass();// 獲取方法Method test = aClass.getDeclaredMethod("test", String.class);// 設置方法可訪問test.setAccessible(true);// 調用方法Object o = test.invoke(person, "參數列表");}
}


3.反編譯 String 類的構造方法簽名

public class MethodTest2 {public static void main(String[] args) throws ClassNotFoundException {// 獲取類Class<?> aClass = Class.forName("java.lang.String");// 獲取類修飾符String classMod = Modifier.toString(aClass.getModifiers());// 獲取簡單類名String className = aClass.getSimpleName();// 獲取簡單父類名String classSupName = aClass.getSuperclass().getSimpleName();// 獲取父類接口Class<?>[] classInterfaces = aClass.getInterfaces();// 獲取構造方法Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();// 拼接字符串StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(classMod);stringBuilder.append(" class ");stringBuilder.append(className);stringBuilder.append(" extends ");stringBuilder.append(classSupName);if (classInterfaces.length > 0) {stringBuilder.append(" implements ");for (int i = 0; i < classInterfaces.length; i++) {stringBuilder.append(classInterfaces[i].getSimpleName());if (i != classInterfaces.length - 1) {stringBuilder.append(", ");}}}stringBuilder.append(" {\n");for (Constructor<?> declaredConstructor : declaredConstructors) {// 獲取構造方法修飾符String constructorMod = Modifier.toString(declaredConstructor.getModifiers());stringBuilder.append("\t");stringBuilder.append(constructorMod);// 獲取構造方法名String constructorName = declaredConstructor.getName().replaceAll("java.lang.", "");stringBuilder.append(" ");stringBuilder.append(constructorName);// 獲取構造方法參數Parameter[] parameters = declaredConstructor.getParameters();stringBuilder.append(" (");if (parameters.length > 0) {for (int i = 0; i < parameters.length; i++) {// 獲取參數類型String paraType = parameters[i].getType().getSimpleName();stringBuilder.append(paraType);// 獲取參數名String paraName = parameters[i].getName();stringBuilder.append(" ");stringBuilder.append(paraName);if (i != parameters.length - 1) {stringBuilder.append(", ");}}}stringBuilder.append(") {}\n");}stringBuilder.append("}");System.out.println(stringBuilder);}
}


4.通過反射調用構造方法

public class Person {public String name;private int age;protected String sex;public static String country;public static final String job = "程序員";public Person() {}public Person(String name, int age, String sex) {this.name = name;this.age = age;this.sex = sex;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public static String getCountry() {return country;}public static void setCountry(String country) {Person.country = country;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", sex='" + sex + '\'' +'}';}
}
public class UseConstructor {public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Person person = new Person();// 獲取Class對象Class<? extends Person> aClass = person.getClass();// 獲取無參構造方法Constructor<? extends Person> c1 = aClass.getDeclaredConstructor();System.out.println(c1);Person p1 = c1.newInstance();System.out.println(p1);// 獲取有參構造方法Constructor<? extends Person> c2 = aClass.getDeclaredConstructor(String.class, int.class, String.class);System.out.println(c2);Person p2 = c2.newInstance("孔明", 18, "男");System.out.println(p2);}
}


?二、類加載過程

1.裝載(Loading)

(1)說明

  1. 類加載器負責將類的 class 文件讀入內存;
  2. 低版本 JDK 類加載器:
    1. 引導 / 啟動 類加載器:負責加載 rt.jar,即核心類庫;
    2. 擴展 類加載器:負責加載 ext/*.jar ;
    3. 系統 類加載器:負責加載 classpath 中的 class 文件。
  3. jdk 9 之后的 JDK 類加載器:
    1. BootstrapClassLoader(引導 / 啟動 類加載器);
    2. PlatformClassLoader(平臺類加載器);
    3. AppClassLoader(應用類加載器)。
  4. 高版本 JDK 中引入模塊化;
  5. 可以自定義類加載器,只要符合規范即可;
  6. 可以通過 getParent() 方法獲取 當前 類加載器 的 父 類加載器。
public class ClassLoaderTest {public static void main(String[] args) {// 獲取應用類加載器ClassLoader cl1 = Person.class.getClassLoader();System.out.println(cl1);ClassLoader cl2 = ClassLoader.getSystemClassLoader();System.out.println(cl2);ClassLoader cl3 = Thread.currentThread().getContextClassLoader();System.out.println(cl3);// 獲取平臺類加載器ClassLoader cl1Parent = cl1.getParent();System.out.println(cl1Parent);ClassLoader cl2Parent = cl2.getParent();System.out.println(cl2Parent);ClassLoader cl3Parent = cl3.getParent();System.out.println(cl3Parent);// 獲取啟動類加載器,啟動類加載器負責加載核心類庫,名稱讀不到,直接輸出 nullClassLoader cl1GrandParent = cl1Parent.getParent();System.out.println(cl1GrandParent);ClassLoader cl2GrandParent = cl2Parent.getParent();System.out.println(cl2GrandParent);ClassLoader cl3GrandParent = cl3Parent.getParent();System.out.println(cl3GrandParent);}
}


(2)雙親委派機制

  1. 某個類加載器接收到加載類的任務時,通常委托給【父 類加載器】完成加載;
  2. 頂級【父 類加載器】無法加載時,逐層向下委派加載任務;
  3. 這樣做的原因是,可以保證程序的安全,也可以防止類加載重復。

2.鏈接(Linking)?

(1)驗證(Verify)

? ? ? ? 確保類加載信息符合 JVM 規范。


(2)準備(Prepare)?

  1. 正式為靜態變量在方法區開辟存儲空間并賦默認值;
  2. 舉例如下:
    1. public static int i = 1;? ? ? ? // 實際上,賦默認值 0?
    2. public static final int i = 1;? ? ? ? // 此時賦值 1

(3)解析(Resolve)

? ? ? ? 將虛擬機常量池中的符號引用替換為直接引用,即替換為地址。?


3.初始化(initialization)?

  1. 為靜態變量賦值;
  2. 執行靜態代碼塊。

三、類加載器獲取 Class

1.說明

? ? ? ? 上一節談到,通過類加載器的方式可以獲取 Class 。下面將做出詳細解釋:

public class ReflectLoader {public static void main(String[] args) throws ClassNotFoundException {// 獲取 系統類 / 應用類 加載器,負責加載 classpath 中的 class 文件ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();System.out.println(systemClassLoader);// 加載 class,只是完成了類加載過程中的裝載與鏈接,還沒有初始化Class<?> aClass = systemClassLoader.loadClass("reflecttest.Person");System.out.println(aClass);// 在這個類第一次被真正使用的時候,才會初始化這個類}
}
public class Person {public String name;private int age;protected String sex;public static String country;public static final String job = "程序員";static {System.out.println("Person類靜態代碼塊執行了");}public Person() {}public Person(String name, int age, String sex) {this.name = name;this.age = age;this.sex = sex;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public static String getCountry() {return country;}public static void setCountry(String country) {Person.country = country;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", sex='" + sex + '\'' +'}';}
}


2.與 Class.forName() 比較

? ? ? ? Class.forName() 會完成類加載的全部過程,如果使用類加載器的方式,可以看出沒有執行靜態代碼塊,也就是沒有執行初始化的過程。而使用 Class.forName() 的方式,可以看到靜態代碼塊執行了。

public class ReflectTest {public static void main(String[] args) throws ClassNotFoundException {Class<?> aClass = Class.forName("reflecttest.Person");System.out.println(aClass);}
}


?四、反射的泛型

1.父類的泛型

public class Animal<A, B, C> {
}
public class Dog extends Animal<String, Integer, Boolean> {
}
public class Test {public static void main(String[] args) {// 反射獲取類Class<Dog> dogClass = Dog.class;// 獲取當前類的父類泛型Type genericSuperclass = dogClass.getGenericSuperclass();// 如果父類使用了泛型if (genericSuperclass instanceof ParameterizedType){// 轉換為參數化類型ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;// 獲取泛型數組Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();// 遍歷泛型數組for (Type actualTypeArgument : actualTypeArguments) {System.out.println(actualTypeArgument.getTypeName());}}}


2.接口的泛型?

public interface Animal<T, V, K> {
}
public class Cat implements Animal<String, Integer, Boolean> {
}
public class Test {public static void main(String[] args) {// 反射獲取類Class<Cat> catClass = Cat.class;// 獲取接口的泛型Type[] genericInterfaces = catClass.getGenericInterfaces();for (Type genericInterface : genericInterfaces) {if (genericInterface instanceof ParameterizedType) {ParameterizedType parameterizedType = (ParameterizedType) genericInterface;Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();for (Type actualTypeArgument : actualTypeArguments) {System.out.println(actualTypeArgument);}}}}
}


3.屬性的泛型

public class Animal {public Map<Integer, Boolean> name;
}
public class Test {public static void main(String[] args) throws NoSuchFieldException {// 反射獲取類Class<Animal> animalClass = Animal.class;// 獲取屬性Field field = animalClass.getField("name");// 獲取屬性泛型Type genericType = field.getGenericType();if (genericType instanceof ParameterizedType) {ParameterizedType parameterizedType = (ParameterizedType) genericType;Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();for (Type actualTypeArgument : actualTypeArguments) {System.out.println(actualTypeArgument);}}}
}


4.方法參數的泛型

public class Animal {public void eat(List<String> food) {}
}
public class Test {public static void main(String[] args) throws NoSuchMethodException {// 反射獲取類Class<Animal> animalClass = Animal.class;// 獲取方法Method declaredMethod = animalClass.getDeclaredMethod("eat", List.class);// 獲取方法參數泛型Type[] genericParameterTypes = declaredMethod.getGenericParameterTypes();for (Type genericParameterType : genericParameterTypes) {if (genericParameterType instanceof ParameterizedType){ParameterizedType parameterizedType = (ParameterizedType) genericParameterType;Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();for (Type actualTypeArgument : actualTypeArguments) {System.out.println(actualTypeArgument);}}}}
}


5.方法返回值的泛型

public class Animal {public Map<String, Integer> eat(List<String> food) {return null;}
}
public class Test {public static void main(String[] args) throws NoSuchMethodException {// 反射獲取類Class<Animal> animalClass = Animal.class;// 獲取方法Method declaredMethod = animalClass.getDeclaredMethod("eat", List.class);// 獲取方法返回值的泛型Type genericReturnType = declaredMethod.getGenericReturnType();if (genericReturnType instanceof ParameterizedType){ParameterizedType parameterizedType = (ParameterizedType) genericReturnType;Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();for (Type actualTypeArgument : actualTypeArguments) {System.out.println(actualTypeArgument);}}}
}


6.構造方法參數的泛型

public class Animal {private Map<String, Boolean> name;public Animal(Map<String, Boolean> name) {this.name = name;}
}
public class Test {public static void main(String[] args) throws NoSuchMethodException {// 反射獲取類Class<Animal> animalClass = Animal.class;// 獲取構造方法Constructor<Animal> animal = animalClass.getDeclaredConstructor(Map.class);// 獲取構造方法參數泛型Type[] genericParameterTypes = animal.getGenericParameterTypes();for (Type genericParameterType : genericParameterTypes) {if (genericParameterType instanceof ParameterizedType) {ParameterizedType parameterizedType = (ParameterizedType) genericParameterType;Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();for (Type actualTypeArgument : actualTypeArguments) {System.out.println(actualTypeArgument);}}}}
}

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

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

相關文章

《數據結構:單鏈表》

“希望就像星星&#xff0c;或許光芒微弱&#xff0c;但永不熄滅。” 博主的個人gitee&#xff1a;https://gitee.com/friend-a188881041351 一.概念與結構 鏈表是一種物理存儲上非連續、非順序的存儲結構&#xff0c;數據元素的順序邏輯是通過鏈表中的指針鏈接次序實現的。 單…

藍橋杯 - 中等 - 絕美宋詞

介紹 “今宵酒醒何處&#xff0c;楊柳岸曉風殘月”&#xff0c;“驀然回首&#xff0c;那人卻在燈火闌珊處”&#xff0c;“試問閑愁都幾許&#xff1f;一川煙草&#xff0c;滿城風絮&#xff0c;梅子黃時雨” ...... 宋詞可謂是古代文學桂冠上一顆璀璨的明珠&#xff0c;本題…

JDBC、excute()、DriveManager、Connection、Statement、自建JDBC工具類、占位符

DAY19.2 Java核心基礎 JDBC JDBC&#xff1a;Java database Connectivity JDBC是java程序連接各種數據庫的組件 Mybatis就是基于JDBC的封裝&#xff0c;是獨立于數據庫的管理系統&#xff0c;通用的SQL數據庫存取和操作的公共接口 定義了一套標準&#xff0c;為訪問 不同數…

21天Python計劃:函數簡單介紹

文章目錄 前言一、函數知識體系二、函數基礎函數的定義和調用函數參數 三、函數對象、函數嵌套、名稱空間與作用域、裝飾器函數對象函數嵌套名稱空間與作用域裝飾器 四、迭代器、生成器、面向過程編程迭代器生成器面向過程編程 五、三元表達式、列表推導式、生成器表達式、遞歸…

污水處理廠人員定位方案-UWB免布線高精度定位

1. 方案概述 本方案采用免布線UWB基站與北斗衛星定位融合技術&#xff0c;結合UWBGNSS雙模定位工卡&#xff0c;實現污水處理廠室內外人員高精度定位&#xff08;亞米級&#xff09;。系統通過低功耗4G傳輸數據&#xff0c;支持實時位置監控、電子圍欄、聚集預警、軌跡回放等功…

無人機DSP處理器工作要點!

一、DSP處理器在無人機中的工作要點 1. 高效運算架構 哈佛結構&#xff1a;DSP采用程序與數據存儲分離的哈佛結構&#xff0c;允許同時訪問指令和數據&#xff0c;提升數據吞吐效率。 流水線技術&#xff1a;將指令分解為取指、譯碼、執行等多個階段并行處理&#xff0c…

MySQL查詢成本計算

對于如上SQL&#xff0c;只是因為查詢字段不同&#xff0c;最終執行時選擇的索引就不同&#xff0c;那么MySQL是如何決定選擇使用哪個索引呢&#xff1f; 答案是MySQL會進行成本計算&#xff0c;對于各個場景查詢進行成本預估&#xff0c;最終選擇最優。 我們可以使用trace工具…

《K230 從熟悉到...》矩形檢測

《K230 從熟悉到...》矩形檢測 《廬山派 K230 從熟悉到...》矩形檢測 矩形檢測技術是一種廣泛應用于電子圖像處理的核心技術。它通過識別和分析圖像中的矩形結構&#xff0c;為各種應用提供基礎支持。從傳統圖像處理算法到現代深度學習技術&#xff0c;矩形檢測的實現途徑多種多…

python基礎學習三(元組及字符串的使用)

文章目錄 元組什么是元組元組的創建方式為什么要將元組設計成不可變序列元組的遍歷集合集合的相關操作集合操作集合的數學操作集合生成式列表&#xff0c;字典&#xff0c;元組&#xff0c;集合總結 字符串字符串的駐留機制判斷字符串的操作方法字符串的比較操作字符串的切片操…

Java基礎-22-基本語法-實體類

實體類&#xff08;Entity Class&#xff09; 1. 什么是實體類&#xff1f; 實體類&#xff08;Entity Class&#xff09; 是 Java 中用于表示數據庫表結構或業務對象的類。它通常包含屬性&#xff08;字段&#xff09;和getter/setter 方法&#xff0c;用于存儲和操作數據。…

Android 系統ContentProvider流程

一、ContentProvider初始化注冊流程 源碼查看路徑&#xff1a;http://xrefandroid.com/android-11.0.0_r48/ 涉及到源碼文件&#xff1a; /frameworks/base/core/java/android/content/ContentProvider.java 自定義ContentProvider需要繼承該類,內部類Transport繼承關系如下,實…

爬蟲工程師分享自動批量化獲取商品評論數據的方法有哪些?

在電商領域&#xff0c;商品評論數據對于商家了解產品口碑、洞悉用戶需求&#xff0c;以及開展競品分析等工作具有極其重要的價值。作為爬蟲工程師&#xff0c;掌握自動批量化獲取商品評論數據的方法&#xff0c;能極大提升數據收集效率。下面&#xff0c;我將分享一些實用的操…

Vue3組件事件用戶信息卡練習

用戶信息卡 題目要求 實現一個用戶信息卡系統&#xff0c;包含以下功能&#xff1a; 1.父組件收集用戶信息&#xff08;姓名、年齡、班級&#xff09; 2.子組件接收并展示用戶信息卡片 3.添加基本的數據驗證 <!DOCTYPE html> <html lang"en"> <h…

SpringBean模塊(二)bean初始化(2)和容器初始化順序的比較--引入ApplicationContextInitializer

前面介紹了獲取容器可以讓spring bean實現ApplicationContextAware&#xff0c;實際也是初始化執行了setApplicationContext接口&#xff0c; 初始化接口還可以借助一些注解或者spring bean的初始化方法&#xff0c;那么他們的執行順序是什么樣的呢&#xff1f; 一、驗證&…

中小型企業網絡的搭建

1.1 網絡邏輯拓撲、布線方案的設計 1.1.1 網絡設計依據 網絡設計應遵循以下基本原則&#xff1a; 高效性&#xff1a;確保網絡架構能夠支持企業日常業務的高效運行。 可靠性&#xff1a;采用冗余設計&#xff0c;確保網絡的高可用性&#xff0c;避免單點故障。 可擴展性…

angr基礎學習

參考&#xff1a;angr AngrCTF_FITM/筆記/03/Angr_CTF從入門到精通&#xff08;三&#xff09;.md at master ZERO-A-ONE/AngrCTF_FITM angr_explore 00_angr_find IDA分析結果&#xff1a; 邏輯簡單&#xff0c;輸入&#xff0c;complex_function進行加密&#xff0c;加密…

軟考-高級-系統架構設計師【考試備考資料下載】

計算機技術與軟件專業技術資格&#xff08;水平&#xff09;考試是原中國計算機軟件專業技術資格和水平考試的完善與發展。計算機技術與軟件專業技術資格&#xff08;水平&#xff09;考試是由國家人力資源和社會保障部、工業和信息化部領導下的國家級考試。 計算機技術與軟件專…

3. 第三放平臺部署deepseek

有時候我們會發現使用deepseek服務器&#xff0c;異常卡頓&#xff0c;這是由于多方面原因造成的&#xff0c;比如說訪問人數過多等。想要解決這個問題&#xff0c;我們可以選擇第三方平臺進行部署 第三方平臺 我們可以選擇的第三方平臺很多&#xff0c;比如硅基流動、秘塔搜索…

1.4-蜜罐\堡壘機\API接口

1.4-蜜罐\堡壘機\API接口 蜜罐&#xff1a;用來釣魚或誘惑測試人員的防護系統 bash <(curl -sS -L https://hfish.net/webinstall.sh) # 安裝HFISH蜜罐堡壘機&#xff1a; 運維用的&#xff0c;統一管理運維平臺;拿下堡壘機就很有可能等于拿下了多個平臺 jumpServer一鍵安…

知識圖引導的檢索增強生成

摘要 檢索增強生成&#xff08;RAG&#xff09;已經成為一種很有前途的技術&#xff0c;用于解決大型語言模型&#xff08;LLM&#xff09;生成的響應中的幻覺問題。現有的RAG研究主要集中在應用基于語義的方法來提取孤立的相關組塊&#xff0c;忽略了它們之間的內在關系。在本…