我有以下場景,我有一個類加載器和它加載的類,現在我需要該類的字節碼。以下是我迄今爲止嘗試:爲每個類文件Java:給定類加載器和類,得到類字節代碼
Field f = ClassLoader.class.getDeclaredField("classes");
f.setAccessible(true);
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Vector<Class> classes = (Vector<Class>) f.get(classLoader);
for(Class loadedClass : classes)
{
String className = loadedClass.getName();
String classFileResourcePath = "/" + className.replace(".", "/") + ".class";
InputStream inputStream = classLoader.getResourceAsStream(classFileResourcePath);
System.out.println(">>>> " + className + " => " + classFileResourcePath + " => " + inputStream);
}
此代碼打印null
。但是,當我將其更改爲classLoader.getClass().getResourceAsStream(classFileResourcePath)
時,它在IDE中的獨立Main類中運行時會有效,但當我需要實際上下文時,它也會返回null,這可能是因爲有「特殊」情況發生罐子和幕後的班級。如果不能討論這些細節,只需說出我所擁有的是一個類和加載它的類加載器,現在我需要字節代碼。我該怎麼做呢?如果這在Java層中是不可能的,我可能能夠獲取原始Jar本身並將其作爲zip文件讀取,但這是最後的選擇。
很感謝,我可以使用ASM。問題:你如何從節點獲取原始字節? – 2014-10-29 17:49:21
你想要檢索什麼信息?可能你可以訪問''ClassNode.method'',循環這些條目並將它們轉換爲''MethodNode''。每個「MethodNode」都包含它的指令列表。 – nrainer 2014-10-29 17:53:23
哈哈,不,我真的需要字節,不要問。這似乎工作得到字節''ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS); classNode.accept(classWriter); byte [] bytes = classWriter.toByteArray();'我正在嘗試結果在真正的環境。 – 2014-10-29 18:03:14