( Chỉnh sửa: hai câu trả lời trước đã bị xóa, một câu trả lời cho câu hỏi khi nó đứng trước các chỉnh sửa và một câu trả lời, nếu không hoàn toàn sai, ít nhất là gần với nó. )
Nếu bạn biên dịch với thông tin gỡ lỗi trên ( javac -g
), tên của các biến cục bộ sẽ được giữ trong tệp. Class. Ví dụ, lấy lớp đơn giản này:
class TestLocalVarNames {
public String aMethod(int arg) {
String local1 = "a string";
StringBuilder local2 = new StringBuilder();
return local2.append(local1).append(arg).toString();
}
}
Sau khi biên dịch với javac -g:vars TestLocalVarNames.java
, tên của các biến cục bộ hiện có trong tệp. Class. javap
's -l
cờ ( 'In số dòng và bảng biến cục bộ') có thể hiển thị chúng.
javap -l -c TestLocalVarNames
trình diễn:
class TestLocalVarNames extends java.lang.Object{
TestLocalVarNames();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LTestLocalVarNames;
public java.lang.String aMethod(int);
Code:
0: ldc #2; //String a string
2: astore_2
3: new #3; //class java/lang/StringBuilder
6: dup
7: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
10: astore_3
11: aload_3
12: aload_2
13: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
16: iload_1
17: invokevirtual #6; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
20: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
23: areturn
LocalVariableTable:
Start Length Slot Name Signature
0 24 0 this LTestLocalVarNames;
0 24 1 arg I
3 21 2 local1 Ljava/lang/String;
11 13 3 local2 Ljava/lang/StringBuilder;
}
Thông số kỹ thuật VM giải thích những gì chúng ta đang thấy ở đây:
§4.7.9 LocalVariableTable
Thuộc tính :
Các LocalVariableTable
thuộc tính là một tùy chọn thuộc tính chiều dài thay đổi của một Code
(§4.7.3) thuộc tính. Nó có thể được sử dụng bởi các trình gỡ lỗi để xác định giá trị của một biến cục bộ nhất định trong quá trình thực thi một phương thức.
Việc LocalVariableTable
lưu trữ tên và loại của các biến trong mỗi vị trí, do đó có thể khớp chúng với mã byte. Đây là cách trình gỡ lỗi có thể thực hiện "Đánh giá biểu thức".
Như erickson đã nói, tuy nhiên, không có cách nào để truy cập bảng này thông qua sự phản chiếu bình thường. Nếu bạn vẫn quyết tâm thực hiện việc này, tôi tin rằng Kiến trúc trình gỡ lỗi nền tảng Java (JPDA) sẽ giúp ích (nhưng tôi chưa bao giờ sử dụng nó cho mình).