如何獲得一個類的所有超類使用ASM java字節碼?使用ASM的一個類的所有超類java java字節碼代碼
1
A
回答
0
這樣做的一個簡單方法是訪問類的構造函數的字節碼並記錄第一個構造函數調用指令,即調用您可以找到的invokespecial
。這應該會給你當前感興趣的課程名稱super
。
0
這有點棘手,因爲類文件只包含直接的超類。因此,你必須遞歸讀取所有的超類。
您可以通過使用帶有重寫訪問(int版本,int訪問,字符串名稱,字符串簽名,String superName,String [] interfaces)方法來讀取超類名稱的ClassVisitor來處理每個類。
僞代碼:
List<String> getSuperClasses(className){
superClass=getSuperClass(className)
return superClass+getSuperClasses(superClass)
}
String getSuperClass(className) {
cw=new ClassWriter()
v=new SuperClassReadingClassVisitor(cw)
new ClassReader(className).accept(v)
return v.superClass
}
class SuperClassReadingClassVisitor{
String superClass
@Override
visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
superClass=superName
super.visit(version, access, name, ...)
}
+0
嗨ruediste,非常感謝你,讓我試試這個在我的字節碼注入 –
+0
嗨rudiste,謝謝你的答..我按照以下方式。可以嗎?或者有沒有簡單的方法來獲得所有超類名? –
2
package com.eg.agent;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import org.objectweb.asm.ClassReader;
public class EgClassFileTransformer implements ClassFileTransformer {
protected String agentArgString = "";
protected Instrumentation instrumentation;
public EgClassFileTransformer(String agentArgs, Instrumentation inst){
agentArgString = agentArgs;
instrumentation = inst;
instrumentation.addTransformer(this);
}
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException
{
//System.out.println("ClassName :"+className);
InputStream in = loader.getResourceAsStream(className.replace('.', '/') + ".class");
try{
ClassReader classReader=new ClassReader(in);
String superClassName = classReader.getSuperName();
String[] interfaces = classReader.getInterfaces();
if(interfaces!=null && interfaces.length > 0){
for(int k=0;k<interfaces.length;k++){
String inface = interfaces[k];
System.out.println(" \t interface :"+inface);
}
}
//System.out.println("superClassName :"+superClassName);
ArrayList thisList = new ArrayList();
thisList.add(superClassName);
ArrayList superList = printSuperClassNames(superClassName , thisList);
System.out.println("className :"+className +" ==>"+ " superList :"+superList);
} catch (IOException e) {
//e.printStackTrace();
System.out.println("[EXECEPTION] ..."+className);
}
return null;
}
public static ArrayList printSuperClassNames(String className, ArrayList list)
{
ClassReader cr=null;
try {
cr = new ClassReader(className);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String superName = cr.getSuperName();
//System.out.println("[superName]"+superName);
if(superName!=null && !superName.equals("java/lang/Object"))
{
list.add(superName);
String superClass = superName.replace('.', '/');
printSuperClassNames(superClass, list);
}
return list;
}
}
相關問題
- 1. 使用接口訪問字節代碼類的Java OW2 ASM
- 2. 類Java的字節碼
- 3. Java從字節碼收集所有使用的類
- 4. java字節碼類定義
- 5. 將代碼添加到具有Instrumentation的Java類:ASM或BCEL?
- 6. Java:給定類加載器和類,得到類字節代碼
- 7. 調用一個字節碼類的方法,java
- 8. Java:將代碼移到另一個類後調用超級代碼
- 9. Java源代碼的字節碼
- 10. java源代碼類
- 11. 切換到另一個java類上的代碼java java
- 12. 如何在同一個java代碼中定義兩個超類?
- 13. 幫我翻譯使用字節的Java代碼到jython代碼
- 14. HTML代碼的Java類
- 15. Java庫類的源代碼
- 16. asm lib中的java字節碼生成器的合適輸入類型
- 17. 爲什麼每個Java源文件有多個字節的代碼類文件?
- 18. 如何使用ASM 4.0修改Java字節碼
- 19. 使用HttpURLConnection的ASM字節碼
- 20. 理解Java字節代碼
- 21. 字節碼和ASM
- 22. Java字節碼[在putstatic壞類型]
- 23. ASM:輸出java字節碼和操作碼
- 24. 插入字節碼用ASM
- 25. 將java代碼從一個類插入到另一個類
- 26. Java字節碼
- 27. 使用System.console運行java代碼類
- 28. 從類似HTML代碼的java類啓動一個Servlet
- 29. java字節碼操作;在每個Java代碼之後插入打印代碼
- 30. 爲什麼這個Java代碼中的子類有一個默認的構造函數,如果超類沒有?
維傑你好,謝謝你的幫助..我這樣做以下列方式。可以嗎? –
嘿@RameshSubramanian ...我認爲你的解決方案應該可以工作。我沒有運行它或任何東西,但使用ClassReader應該工作得很好。我不想想這個更簡單的解決方案是愚蠢的。對此表示讚賞。 – vijay