Tôi đang cố gắng để hiểu nếu có một lý do trong spec cho sự khác biệt giữa các mô tả java và chữ ký cho các lớp bên trong. (Tôi đang xem trực tiếp nội dung của các tệp lớp ở đây, nhưng tôi sử dụng javap để minh họa).Java không thống nhất lớp bên trong giữa mô tả và thuộc tính chữ ký? (lớp tập tin)
(nb Tôi đã thử này trên JDK 1.6.0_33 và 1.7.0_05, cả hai đều có cùng một vấn đề khi xem với javap từ Java 7 - java 6 của javap dường như không hiển thị bất kỳ thông tin chữ ký chung chung, như mỗi câu trả lời của Sean dưới đây)
cập nhật:. Nhờ có những thảo luận - mất của tôi là
- Bộ mô tả (mà không chứa thông tin chung chung) là đúng.
- Chữ ký (là thuộc tính của phương thức và chứa thông tin chung) không chính xác. Mục ConstPool liên quan cho SIGNATURE của <init> phương pháp là "ConstantUTF8 [(Ljava/util/danh sách <TE;>) V]"
- javap trong Java 6 không nhìn vào chữ ký, chỉ là mô tả. (Tôi đoán!)
Trong trường hợp bất kỳ ai thắc mắc, tôi nhấn vào đây mà không sử dụng JAVAP, chỉ cần tự xem các tệp lớp, tôi chỉ sử dụng javap để hiển thị nó. (vì vậy nó không phải là một lỗi javap).
xem xét:
public class InnerClassTest1 {
public int getX() {
return new Inner1(new ArrayList<String>()).getX(4);
}
public class Inner1 {
private final List arg;
public Inner1(List arg) {
this.arg = arg;
}....
vs
public class InnerClassTest2 {
public int getX() {
return new Inner1(new ArrayList<String>()).getX(4);
}
public class Inner1<E> {
private final List<E> arg;
public Inner1(List<E> arg) {
this.arg = arg;
}.....
Nếu bạn nhìn vào đầu ra của -cs javap trên các lớp bên trong, họ ngạc nhiên khác nhau!
org.benf.cfr.tests.InnerClassTest1 $ Inner1 (org.benf.cfr.tests.InnerClassTest1, java.util.List); Chữ ký: (Lorg/benf/cfr/kiểm tra/InnerClassTest1; Ljava/util/List;) V
vs
công org.benf.cfr.tests.InnerClassTest2 $ Inner1 (java.util.List <E>); Chữ ký: (Lorg/benf/cfr/tests/InnerClassTest2; Ljava/util/List;) V
... một trong số đó sử dụng Generics thiếu tham số ngầm cho lớp ngoài! (hiển thị chính xác trong InnerClassTest1).
Tôi không thể tìm thấy bất kỳ thứ gì trong tài liệu tệp lớp học để giải thích điều này - có ai biết tại sao điều này có thể là không?
Cảm ơn!
Lee.
Update -
tôi đã đặt file ví dụ tại http://www.benf.org/files/innerClassTest.tgz
Với Sean câu trả lời dưới đây, tôi cố gắng sử dụng javap trên java 6, và tôi thấy đầu ra giống hệt nhau cho cả hai, không có thông tin chung - điều này khiến tôi tin rằng javap java 6 không hiển thị thông tin chữ ký đầy đủ?
Kết quả chính xác tôi được sử dụng javap trên 1.7.0_05-b06 là
public class org.benf.cfr.tests.InnerClassTest2$Inner1<E> {
final org.benf.cfr.tests.InnerClassTest2 this$0;
Signature: Lorg/benf/cfr/tests/InnerClassTest2;
public org.benf.cfr.tests.InnerClassTest2$Inner1(java.util.List<E>);
Signature: (Lorg/benf/cfr/tests/InnerClassTest2;Ljava/util/List;)V
Code:
0: aload_0
1: aload_1
2: putfield #1 // Field this$0:Lorg/benf/cfr/tests/InnerClassTest2;
5: aload_0
6: invokespecial #2 // Method java/lang/Object."<init>":()V
9: aload_0
10: aload_2
11: putfield #3 // Field arg:Ljava/util/List;
14: return
public int getX(int);
Signature: (I)I
Code:
0: iconst_2
1: ireturn
}
Vui lòng chỉ định chi tiết JDK –
Đã cập nhật, cảm ơn. – lab27
Bạn có thể đăng các tệp lớp thực tế không? Điều đó sẽ ít nhất thu hẹp nó xuống một vấn đề trình biên dịch vs một vấn đề disassembler. – Antimony