我想通過查看字節碼來了解正在分配的數組的大小,當然,如果在編譯時知道該信息。背景:我想編寫一個FindBugs檢測器(它查看編譯的字節碼)並報告某些數組分配的事件。爲了濾除誤報,我對「小」數組不感興趣,但只有那些在編譯時不可用或者大於可配置閾值的數組。由於FindBugs源代碼沒有過多的文檔記錄,我正在尋找一些關於如何開始的指針 - 也許已經有一個檢測器做了類似的事情,我可以看看。如何檢測Java字節碼中的數組大小(FindBugs)
4
A
回答
2
這可以得到一定的技巧。我的知識不完整,但至少有三種指示要注意(NEWARRAY,ANEWARRAY和MULTIANEWARRAY)。查看前面的指令(或者對於MULTIANEWARRAY,n先前的指令)會獲得大小,即使它是常量,也可能會根據大小加載BIPUSH,SIPUSH或LDC(其他任何東西?)。正如你所指出的,如果這個類是計算的結果,你可能會無限期地追蹤指令。
如果我沒有記錯的話,FindBugs會在內部使用BCEL,但我從來沒有在那裏挖過來看到他們究竟有多聰明。如果其中任何一支隊伍都有適當的郵件列表,他們可能會證明是一個更好的地方 - 他們可能至少知道是否有人在此之前走過這條路。
5
那麼,如果它們是基於一個常量分配的,那麼您可以檢查一個在分配之前被推入的常量。例如:
class ArraySize {
private static final int smallsize = 10;
private static final int largesize = 1000;
public static void main(String[] args) {
int[] small = new int[smallsize];
int[] big = new int[largesize];
}
}
給人的字節碼:
Compiled from "ArraySize.java"
class ArraySize extends java.lang.Object{
ArraySize();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: bipush 10
2: newarray int
4: astore_1
5: sipush 1000
8: newarray int
10: astore_2
11: return
}
相關問題
- 1. 從ecg字節數組中檢測到的java QR碼
- 2. 檢測字節數組C的編碼#
- 3. BufferedImage字節數組大小
- 4. 如何訪問不同大小的數組的字節數組?
- 5. 如何檢測字節數組中的^ A等特殊字符
- 6. 如何在java中檢測窗口字體大小(100%,125%,150%)
- 7. 本地java字節碼檢測
- 8. 如何知道Java方法的字節碼大小
- 9. 檢測Tesseract OCR Java實現的大小字體大小
- 10. 如何調整字節數組中的圖片大小?
- 11. 如何獲取Swift中任意數組的字節大小?
- 12. 固定大小的字節數組
- 13. Alllocate正確的字節數組大小
- 14. Java中的數組大小
- 15. C++元編程檢測大小數組
- 16. 從指針數組中獲取特定字節數組的大小爲字節
- 17. 如何檢索此數組的大小?
- 18. 本地java函數的字節碼檢測
- 19. Python:如何從一個4字節的字節數組中獲取一個4字節大小的整數?
- 20. java中的字節數組
- 21. 如何在Java中編寫大型靜態字節數組?
- 22. 如何將Java字節數組轉換爲Scala字節數組?
- 23. 如何從方法返回未知大小的字節數組
- 24. 如何確定PyTables數組的大小(以字節爲單位)?
- 25. 如何檢索SID的字節數組
- 26. 使用字節數組檢查圖像大小
- 27. Java數組大小
- 28. 如何通過Java代理保存檢測到的java字節碼?
- 29. 前面加上一個字節數組的大小,以字節數組
- 30. 在Windows Phone上檢測流或字節數組編碼
謝謝,這已經是一個開始。在你的例子中,它會內聯常量。當你有像 int x = 10; 新字節[5 + x]; 雖然15是明顯的結果,但取決於編譯器(及其設置),這可能最終會在新分配之前在堆棧上進行計算。我想知道,如果在FindBugs中有一個標準的方法來實現這個功能。 – 2009-06-15 13:51:56