2011-09-07 53 views
0

我一直在搜索Web的指南/幫助,通過接口訪問字節代碼類,該字節代碼類被轉移到ASM中。 我已經看到這個名爲powerbot(RSBot)的RuneScape機器人完成哪個源我也得到了https://github.com/powerbot/RSBot,但我不明白它是如何完成的,因爲我將類轉換爲包含每個「骨架」方法..我知道它一定是愚蠢的想像你可以只投一個類來接口..我知道必須有一些準備,但在ASM書籍/電子書(http://download.forge.objectweb.org /asm/asm-guide.pdf)就我而言,並沒有什麼關於它的。我真的很感興趣,不是爲了製作一個新的RS機器人,而是爲了學習這個很酷的庫,以便根據我的需求來替換BCEL。我會給你一個快速的例子來更好地理解這個問題!使用接口訪問字節代碼類的Java OW2 ASM

在這裏,我有課稱爲「helloSO」

public class helloSO { 

    public void doSomething(){ 
     System.out.println("I did something! :D"); 
    } 

} 

,在這裏我有界面稱爲「helloSO」也

public interface helloSO { 

    public void doSomething(); 

} 

我想能夠投出的.class我讀和使用ASM定義類到該接口,以便能夠使用它們的名稱調用該實例中的方法..我希望我解釋得很好。如果你想要的話,你可以檢查RSBot,看看我的意思。 :)所以我問的是,我需要做哪些準備以及我可以在哪裏瞭解他們?我不是要求你創建我的類適配器或任何只是建議和幫助:) 在此先感謝!

回答

0

使用ClassAdapter添加接口其實很簡單,如果您的類已經包含匹配的方法。你只需要選擇覆蓋被傳遞接口名稱的數組visit方法和委託給超級實施前增加一個接口:

@Override 
public void visit(final int version, final int access, final String classname, final String signature, final String superName, final String[] interfaces) { 
    Set<String> newinterfaces = new HashSet<String>(Arrays.asList(interfaces)); 
    newinterfaces.add(helloSO.class.getName().replace('.', '/')); 
    super.visit(version, access, classname, signature, superName, newinterfaces.toArray(new String[newinterfaces.size()])); 
} 

我使用的是Set這裏的接口的情況下,這個類已經實現新的界面。這些接口使用其內部名稱進行命名,這意味着包名稱中的點將被斜線替換。