簡體   English   中英

如何在運行時使用 Java 調試接口從 Jar 文件加載 class

[英]How to load a class from a Jar file at runtime with the Java Debug Interface

我試圖在運行時注入 ByteBuddy 代理,以防在啟動 JVM 時機器上不存在 ByteBuddy(因此不在類路徑中)。 我的第一個想法是將 bytebuddy 庫 jar 文件添加到類路徑中存在的目錄中,以便在我注入代理時加載它,但我找不到檢索正在運行的 JVM 的類路徑的方法。 因此,我想知道是否可以在注入我的代理之前使用 Java 調試接口手動加載 JVM 中的 bytebuddy 庫 jar 文件。

我嘗試修改這段代碼(使用 JDI),前兩行轉換為:

ClassType jarFileClass = (ClassType) findClassRef("java.util.jar.JarFile");
Method jarFileInit = findOverloadRef("java.util.jar.JarFile", "<init>", "java.lang.String");
Method entries = findOverloadRef("java.util.jar.JarFile", "entries", "");
ArrayList<Value> argz = new ArrayList<Value>();
argz.add(vm.mirrorOf(path)); // path is the path to the bytebuddy library jar file, as a String
ObjectReference jarFile = jarFileClass.newInstance(ev.thread(), jarFileInit, argz, ObjectReference.INVOKE_SINGLE_THREADED);
ObjectReference x = jarFile.invokeMethod(ev.thread(), entries, new ArrayList<Value>(), ObjectReference.INVOKE_SINGLE_THREADED);

其中findClassReffindOverloadRef是我自己的方法,分別獲取ReferenceTypeMethod object。 可悲的是,由於java.net.URL[] class 未加載到 JVM 中,因此我無法進一步了解,因此我無法為其獲取 ReferenceType。

我怎樣才能追求我的追求?

通常,代理會將其所有依賴項隱藏到單個 jar 中。 這仍然可能是有問題的。 Byte Buddy 是一個相當常見的依賴項,它已經在 class 路徑上,但版本不同。 為了避免這種情況,許多代理將它們的依賴關系隱藏到不同的名稱空間中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM