2012-07-26 20 views
2

當爲其不同的方法檢測類時爲了使方法在文本文件中執行寫入操作。我首先將該字符串存儲在明確定義的局部變量3160中。如何選擇這些變量以防止與已有變量衝突。如何在使用asm庫進行檢測的方法中找到空的局部變量

就像這段代碼每次進入任何方法時,代碼都會將類名寫入文本文件。爲了做到這一點,必須使用變量3160將字符串s加載到堆棧上(值保持較大,以便已定義的變量名稱不與變量s衝突(3160)。我的問題是如何在方法中定義局部變量與ASM庫儀器儀表中,這個問題似乎那種不成熟的很多,但是那是因爲我是一個初學者。

String s= className; 
    mv.visitLdcInsn(s); 
    mv.visitVarInsn(Opcodes.ASTORE, 3160); 
    mv.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuilder"); 
    mv.visitInsn(Opcodes.DUP); 
    mv.visitVarInsn(Opcodes.ALOAD, 3160); 
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/String", "valueOf", "(Ljava/lang/Object;)Ljava/lang/String;"); 
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V"); 
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/me/database/dataCollectionFile/Info", "callMeAnyTime", "()Ljava/lang/String;"); 
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;"); 
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;"); 

回答

2

您應該使用LocalVariablesSorter適配器(要麼擴展您自己的訪問者,要麼將其添加到MethodWriter之前的遊客鏈中)。那麼當你需要一個新變量時,你可以調用LocalVariablesSorter.newLocal()方法來獲得分配的新變量槽。另請參閱ASM guide瞭解更多詳情。

+0

謝謝,是的,讓我來實現它,這是一個更乾淨的解決方案,並將解決我的問題:) +1 – 2012-07-26 13:33:50

+1

你能解釋一下如何讓你只用一遍就添加一個局部變量。即當你想插入一個局部變量時,它如何知道剩下的代碼將使用多少局部變量? – 2012-07-26 13:34:01

+0

你能解決這個問題嗎?我想知道,當我們在字節碼中遇到一個字節碼方法調用時,它有一些形式。我想知道被調用的方法的信息存儲在哪裏,有沒有任何表,以及如何訪問它。 – 2012-07-26 13:36:51

1

我會看的局部變量調試表,我會用下一個可用的ID是更可能是2或10,而不是3160.

如果您沒有調試信息,則可能需要多次掃描代碼,首先查看已使用多少個ID

注意:由於歷史原因,doublelong需要兩個ID。

+0

如何可以IDS並串走?你能不能建議一些非常好的資源來輕鬆學習字節碼,它們是如何工作的等等:) – 2012-07-26 13:00:58

+0

ids的數量就像局部變量的數量。我不確定字節碼是否容易。如果你想要簡單的話,使用Java;)http://en.wikibooks.org/wiki/Java_Programming/Byte_Code – 2012-07-26 13:05:39

+0

你是對的它堅韌的希望它不是不可能的,但:) :) D – 2012-07-26 13:12:12

1

newLocal(Type.type)是我發現會在我的情況,以幫助謝謝尤金庫列紹夫和

彼得Lawrey的幫忙:)

相關問題