Sto cercando di capire se c'è un motivo nelle specifiche per la discrepanza tra i descrittori java e le firme per le classi interne. (Sto guardando direttamente il contenuto dei file di classe qui, ma io uso javap per illustrare).Incoerenza della classe interna Java tra descrittore e attributo della firma? (file di classe)
(nb ho provato questo su JDK 1.6.0_33 e 1.7.0_05, entrambi hanno lo stesso problema se visti con javap da Java 7 - Java 6 di javap non sembra mostrare alcun informazioni firma generica, come per ogni risposta di Sean sotto)
Update:. Grazie a chi discutere - il mio prendere è
- Il descrittore (che non contiene informazioni generiche) è corretta.
- La firma (che è un attributo del metodo e contiene informazioni generiche) non è corretta. La voce ConstPool rilevanti per la firma del init > metodo di < è "ConstantUTF8 [(Ljava/util/lista <TE;>) V]"
- javap in Java 6 non sembra al momento della firma, solo il descrittore. (La mia ipotesi!)
Nel caso in cui qualcuno si chieda, lo prendo senza usare JAVAP, guardando solo i file di classe, sto usando solo javap per mostrarlo. (quindi è improbabile che sia un javap bug).
considerare:
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;
}.....
Se si guarda l'output di -cs javap sulle classi interne, sono sorprendentemente diverso!
pubblico org.benf.cfr.tests.InnerClassTest1 $ INNER1 (org.benf.cfr.tests.InnerClassTest1, java.util.List); Firma: (Lorg/benf/CFR/test/InnerClassTest1; Ljava/util/Lista;) V
vs
pubblico org.benf.cfr.tests.InnerClassTest2 $ INNER1 (java.util.List <E>); Firma: (Lorg/benf/CFR/test/InnerClassTest2; Ljava/util/Elenco;) V
... quello che utilizza generici manca il parametro implicito per classe esterna! (è presente correttamente in InnerClassTest1).
Non riesco a trovare nulla nella documentazione del file di classe per spiegare questo - qualcuno sa perché questo potrebbe essere?
Grazie!
Lee.
Aggiornamento -
Ho messo file di esempio a http://www.benf.org/files/innerClassTest.tgz
Dato risposta di Sean sotto, ho provato ad utilizzare javap su Java 6, e ho visto di uscita identica per entrambi, senza informazioni generiche - questo mi porta a credere che javap di java 6 non mostri informazioni complete sulla firma?
L'uscita esatta ottengo utilizzando javap su 1.7.0_05-b06 è
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
}
Per favore, specificare i dettagli JDK –
Aggiornato, grazie. – lab27
Potresti pubblicare i file di classe attuali? Ciò potrebbe almeno ridurlo a un problema del compilatore rispetto a un problema del disassemblatore. – Antimony