Niespójność klasy wewnętrznej Java między atrybutem deskryptora a podpisem? (plik klasy)
Próbuję zrozumieć, czy w specyfikacji istnieje powód rozbieżności między deskryptorami Java i sygnaturami dla klas wewnętrznych. (Patrzę bezpośrednio na zawartość plików klas tutaj, ale do zilustrowania używam javap).
(n.b. Próbowałem tego na JDK 1.6.0_33 i 1.7.0_05, oba mają ten sam problemoglądany z javapem z Java 7 - javap java 6 nie pokazuje żadnych ogólnych informacji o podpisie, zgodnie z odpowiedzią Seana poniżej. )
Aktualizacja: Dzięki tym dyskusjom - moje podejście jest
Deskryptor (który nie zawiera ogólnych informacji) jest poprawny.Podpis (który jest atrybutem metody i zawiera informacje ogólne) jest niepoprawny. Odpowiedni wpis ConstPool dla PODPISU metody <init> to „ConstantUTF8 [(Ljava / util / list <TE;>) V]”Javap w Javie 6 nie przegląda podpisu, tylko deskryptor. (Zgaduję że!)W przypadku, gdy ktoś się zastanawia, trafiłem na to bez użycia JAVAP, po prostu patrząc na pliki klas, używam tylko javap, aby to pokazać. (więc raczej nie będzie to błąd javap).
Rozważać:
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;
}.....
Jeśli spojrzysz na wyjście javap -cs na klasach wewnętrznych, są zaskakująco różne!
public org.benf.cfr.tests.InnerClassTest1 $ Inner1 (org.benf.cfr.tests.InnerClassTest1, java.util.List); Podpis: (Lorg / benf / cfr / tests / InnerClassTest1; Ljava / util / List;) V
vs
public org.benf.cfr.tests.InnerClassTest2 $ Inner1 (java.util.List <E>); Podpis: (Lorg / benf / cfr / tests / InnerClassTest2; Ljava / util / List;) V
...ten, który używa generycznych, nie ma domyślnego parametru dla klasy zewnętrznej! (jest poprawnie obecny w InnerClassTest1).
Nie mogę znaleźć niczego w dokumentacji pliku klas, aby to wyjaśnić - czy ktoś wie, dlaczego tak może być?
Dzięki!
Zawietrzny.
Aktualizacja -
Umieściłem przykładowe pliki whttp://www.benf.org/files/innerClassTest.tgz
Biorąc pod uwagę odpowiedź Seana poniżej, próbowałem użyć javap w java 6 i widziałem identyczne wyjście dla obu, bez ogólnych informacji - to prowadzi mnie do przekonania, że javap java 6 nie wyświetla pełnej informacji o podpisie?
Dokładne dane wyjściowe, które otrzymuję za pomocą javap na 1.7.0_05-b06 to
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
}