最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用graalvm為帶有反射功能的java代碼生成native?image的示例詳解

 更新時間:2024年02月09日 09:16:35   作者:心與夢  
graalvm讓native鏡像支持反射的關鍵是利用json提前告訴它哪些類的哪些方法會被反射調(diào)用,然后它就能力在運行時支持反射了,這篇文章主要介紹了如何使用graalvm為帶有反射功能的java代碼生成native?image,需要的朋友可以參考下

譯自Configure Native Image with the Tracing Agent graal官方文檔 , 以下所有命令需要在linux環(huán)境下操作,graalvm也支持windows。

要為使用 Java 反射、動態(tài)代理對象、JNI 或類路徑資源的 Java 應用程序構(gòu)建本機可執(zhí)行文件,應為 native-image 工具提供 JSON 格式的配置文件或在代碼中預先計算元數(shù)據(jù)。

您可以手動創(chuàng)建配置文件,但更方便的方法是使用跟蹤代理(即Tracing agent,下面用代理一詞代稱)生成配置。本指南演示如何使用代理進行配置 native-image 。當您在 JVM 上運行應用程序時,代理會自動為您生成配置。

若要了解如何使用代碼中預先計算的元數(shù)據(jù)生成本機可執(zhí)行文件,請參閱文檔 - Reachability Metadata 可訪問性元數(shù)據(jù)

本指南中的示例應用程序使用 Java 反射。該 native-image 工具僅部分檢測使用 Java 反射 API 訪問的應用程序元素。因此,您需要向它提供有關反射訪問的類、方法和字段的詳細信息。

不配置Json格式的反射信息示例

將以下源代碼保存在名為 ReflectionExample.java 的文件中:

 import java.lang.reflect.Method;
 class StringReverser {
     static String reverse(String input) {
         return new StringBuilder(input).reverse().toString();
     }
 }
 class StringCapitalizer {
     static String capitalize(String input) {
         return input.toUpperCase();
     }
 }
 public class ReflectionExample {
     public static void main(String[] args) throws ReflectiveOperationException {
         if (args.length == 0) {
             System.err.println("You must provide the name of a class, the name of its method and input for the method");
             return;
         }
         String className = args[0];
         String methodName = args[1];
         String input = args[2];
         Class<?> clazz = Class.forName(className);
         Method method = clazz.getDeclaredMethod(methodName, String.class);
         Object result = method.invoke(null, input);
         System.out.println(result);
     }
 }

該Java 應用程序使用命令行參數(shù)來確定要執(zhí)行的反射操作。

運行如下命令:

$JAVA_HOME/bin/javac ReflectionExample.java   # 編譯
$JAVA_HOME/bin/java ReflectionExample StringReverser reverse "hello"   # 輸出 olleh
$JAVA_HOME/bin/java ReflectionExample StringCapitalizer capitalize "hello"   # 輸出 HELLO

使用 native-image 命令創(chuàng)建本機可執(zhí)行文件,如下所示:

 $JAVA_HOME/bin/native-image --no-fallback ReflectionExample

使用以下命令運行生成的本機可執(zhí)行文件:

./reflectionexample StringReverser reverse "hello"

您將看到一個異常,類似于:

 Exception in thread "main" java.lang.ClassNotFoundException: StringReverser
 at java.lang.Class.forName(DynamicHub.java:1338)
 at java.lang.Class.forName(DynamicHub.java:1313)
 at ReflectionExample.main(ReflectionExample.java:25)

這表明,根據(jù)靜態(tài)分析,native-image 工具無法確定 StringReverser 類是否被使用,所以未將其包含在本機可執(zhí)行文件中。

配置Json格式的反射信息示例

以下步驟演示如何使用代理及其輸出來創(chuàng)建依賴于反射且需要配置的本機可執(zhí)行文件。

在工作目錄中創(chuàng)建名為 META-INF/native-image 的目錄:

mkdir -p META-INF/native-image

在啟用代理的情況下運行應用程序生成json配置,如下所示:

$JAVA_HOME/bin/java -agentlib:native-image-agent=config-output-dir=META-INF/native-image ReflectionExample StringReverser reverse "hello"

此命令創(chuàng)建一個名為 reflect-config.json 的文件,其中包含類 StringReverser 的名稱及其 reverse() 方法。

 [
 {
 "name":"StringReverser",
 "methods":[{"name":"reverse","parameterTypes":["java.lang.String"] }]
 }
]

構(gòu)建本機可執(zhí)行文件:

$JAVA_HOME/bin/native-image ReflectionExample

native-image 工具會自動使用 META-INF/native-image 目錄中的配置文件。但是,建議將 META-INF/native-image 目錄放到類路徑上,可以通過 JAR 文件或使用標志 -cp 。(這樣可以避免 IDE 用戶在目錄結(jié)構(gòu)由 IDE 本身定義時出現(xiàn)混淆。)

測試可執(zhí)行文件

./reflectionexample StringReverser reverse "hello" # 輸出 olleh
./reflectionexample StringCapitalizer capitalize "hello"

執(zhí)行后會看到一個異常,類似于:

 Exception in thread "main" java.lang.ClassNotFoundException: StringCapitalizer
 at java.lang.Class.forName(DynamicHub.java:1338)
 at java.lang.Class.forName(DynamicHub.java:1313)
 at ReflectionExample.main(ReflectionExample.java:25)

跟蹤代理和 native-image 工具都無法確保配置文件完整。當您運行程序時,代理會觀察并記錄使用反射訪問了哪些程序元素。在這種情況下,該 native-image 工具尚未配置為包含對類 StringCapitalizer 的引用。

更新配置以包含類 StringCapitalizer 。您可以使用以下 config-merge-dir 選項手動編輯 reflect-config.json 文件或重新運行跟蹤代理以更新現(xiàn)有配置文件,如下所示:

 $JAVA_HOME/bin/java -agentlib:native-image-agent=config-merge-dir=META-INF/native-image ReflectionExample StringCapitalizer capitalize "hello"

此命令更新 reflect-config.json 文件,以包含類 StringCapitalizer 的名稱及其 capitalize() 方法。

 [
     {
     "name":"StringCapitalizer",
     "methods":[{"name":"capitalize","parameterTypes":["java.lang.String"] }]
     },
     {
     "name":"StringReverser",
     "methods":[{"name":"reverse","parameterTypes":["java.lang.String"] }]
     }
 ]

重新生成本機可執(zhí)行文件并運行,不會有報錯了。

 $JAVA_HOME/bin/native-image ReflectionExample
 ./reflectionexample StringCapitalizer capitalize "hello"

總結(jié)

graalvm讓native鏡像支持反射的關鍵是利用json提前告訴它哪些類的哪些方法會被反射調(diào)用,然后它就能力在運行時支持反射了。

到此這篇關于如何使用graalvm為帶有反射功能的java代碼生成native image的文章就介紹到這了,更多相關graalvm 生成native image內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java實現(xiàn)計算周期性提醒的示例

    java實現(xiàn)計算周期性提醒的示例

    本文分享一個java實現(xiàn)計算周期性提醒的示例,可以計算父親節(jié)、母親節(jié)這樣的節(jié)日,也可以定義如每月最好一個周五,以方便安排會議
    2014-04-04
  • 命令行中 javac、java、javap 的使用小結(jié)

    命令行中 javac、java、javap 的使用小結(jié)

    使用 java 命令運行一個.class文件,需要使用該類的全限定類名,同時需要在當前路徑下有該類的包層次文件夾,這篇文章主要介紹了命令行中 javac、java、javap 的使用小結(jié),需要的朋友可以參考下
    2023-07-07
  • 使用Maven中的scope總結(jié)

    使用Maven中的scope總結(jié)

    這篇文章主要介紹了使用Maven中的scope總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java通過freemarker生成Word文檔導出的方式詳解

    Java通過freemarker生成Word文檔導出的方式詳解

    本文詳細介紹了如何使用FreeMarker模板生成Word文檔,包括制作FTL模板、在Java中使用FreeMarker生成文檔以及處理動態(tài)數(shù)據(jù)和合并單元格等內(nèi)容,需要的朋友可以參考下
    2025-03-03
  • SpringMvc響應數(shù)據(jù)及結(jié)果視圖實現(xiàn)代碼

    SpringMvc響應數(shù)據(jù)及結(jié)果視圖實現(xiàn)代碼

    這篇文章主要介紹了SpringMvc響應數(shù)據(jù)及結(jié)果視圖實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Java?將HTML轉(zhuǎn)為XML的詳細步驟

    Java?將HTML轉(zhuǎn)為XML的詳細步驟

    這篇文章主要介紹了Java?將HTML轉(zhuǎn)為XML,本文將以html轉(zhuǎn)為xml格式為例,介紹如何實現(xiàn)轉(zhuǎn)換,以下是詳細方法及步驟,需要的朋友可以參考下
    2022-06-06
  • java中 Map<String,Object>用法(示例代碼整合)

    java中 Map<String,Object>用法(示例代碼整合)

    Java中Map<String, Object>是參數(shù)化接口,用于存儲鍵值對(鍵為String,值為Object),適用于動態(tài)數(shù)據(jù)存儲、配置信息及JSON處理,需注意類型轉(zhuǎn)換和空指針異常,下面通過示例代碼給大家介紹java中 Map<String,Object>用法,感興趣的朋友一起看看吧
    2025-07-07
  • 淺談如何在項目中使用Spring Cloud Alibaba Sentinel組件

    淺談如何在項目中使用Spring Cloud Alibaba Sentinel組件

    隨著微服務的流行,服務和服務之間的穩(wěn)定性變得越來越重要。本文主要介紹了使用Spring Cloud Alibaba Sentinel組件,感興趣的可以了解一下
    2021-07-07
  • SpringBoot依賴及其作用分析

    SpringBoot依賴及其作用分析

    這篇文章主要介紹了SpringBoot依賴及其作用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Java日常練習題,每天進步一點點(60)

    Java日常練習題,每天進步一點點(60)

    下面小編就為大家?guī)硪黄狫ava基礎的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-08-08

最新評論

马山县| 前郭尔| 泽州县| 平武县| 淳安县| 屏东市| 华蓥市| 留坝县| 常州市| 眉山市| 会昌县| 瓮安县| 丰台区| 玉山县| 五指山市| 谢通门县| 福鼎市| 阜南县| 临江市| 吴江市| 宜宾县| 辽阳市| 屏边| 沅江市| 亳州市| 南乐县| 太谷县| 同德县| 延庆县| 会泽县| 柳州市| 灵璧县| 云浮市| 玉环县| 堆龙德庆县| 察哈| 临清市| 山东| 新巴尔虎右旗| 固镇县| 望城县|