2014-10-11 60 views
1

我有一個web應用程序,我想如下大致的工作:如何獲取從jar中加載的任何類而不是在類路徑中?

有人上傳了一個罐子類的名稱一起(比如myjar.jar)分析(比如test.Test)。分析的確切目的是無關緊要的,所以假設網絡應用程序對其進行了一些靜態分析。

我能夠使用描述的攻擊herehere(MultiClassLoader)以Java的方式上傳jar和加載類。

如果我知道類中的方法,我可以使用反射來調用它們。下面假設與簽名foo(String)

Class c = jarLoader.loadClass("test.Test", true); 
Object instance = c.newInstance(); 
Method foo = instance.getClass().getDeclaredMethod("foo", new Class[]{String.class}); 
    // foo takes one para String    
foo.setAccessible(true); 
foo.invoke(instance, (Object) "hello");    

的方法現在,假設我需要找出方法有內test.Test。要做到這一點,我使用ASM framework,需要類作爲流。這是我遇到問題的地方。我無法執行getResourceAsStream或其等價物。這是我的嘗試:

Type t = org.objectweb.asm.Type.getType(c); // uses asm library 
String url = t.getInternalName() + ".class"; 
c.getClassLoader().getResourceAsStream(url); // gives null 

同樣的問題,如果我使用:

c.getClassLoader().getResourceAsStream(c.getSimpleName() + ".class"); 

什麼是獲得資源的流,這裏的資源是一個類文件的正確方法從不在類路徑中的jar中加載。請注意,整個事情是通過網絡應用程序完成的。

編輯:獲取方法只是一個例子。我真正想要的是將課堂作爲一個流。我需要使用ASM,因爲它提供了其他信息(例如參數名稱),我無法通過getDeclaredMethodsgetMethods獲得這些信息。

回答

1

回覆:「現在我需要找出方法有內test.Test」

你可以通過Class c = jarLoader.loadClass("test.Test", true);獲取類。 Class也有getDeclaredMethods()getMethods()


編輯:@ Jus12,從你的第二個鏈接Java Tip 70: Create objects from jar files!

protected byte[] loadClassBytes (String className)

ASM有ClassReader(byte[] b)構造。

+0

請參閱我的編輯。我想要的不僅僅是獲取方法。我需要這個類作爲流,因爲這就是asm分析器所需要的。 – Jus12 2014-10-11 13:54:52

0

我不知道Java提供了一種以編程方式做到這一點,但我可以建議一個黑客:有產生新的進程:

jar xf myjar.jar test/Test.class | javap -cp test -c Test

這應該輸出字節碼。然後只需將輸出重定向到您可以讀取的流。

0

您可以使用URLClassLoader,它的的URL s在其構造函數中。然後,您可以通過調用URLClassLoader實例上的loadClass方法來加載該類,以獲取您之後的類的Class<?>對象。一旦你有了,你就可以使用反射來創建實例,和/或獲得有關該類的一般信息。

我還沒有試過,但URLClassLoader確實也有一個getResourceAsStream方法。

相關問題