Я пытаюсь понять, есть ли в спецификации причина несоответствия между дескрипторами java и подписями для внутренних классов. (Здесь я смотрю непосредственно на содержимое файлов классов, но для иллюстрации использую javap).
( NB я пробовал это на JDK 1.6.0_33 и 1.7.0_05, у обоих есть одна и та же проблема при просмотре с javap из Java 7 - javap java 6, похоже, не показывает никакой общей информации о подписи, согласно ответу Шона ниже.)
Обновление: спасибо тем, кто обсуждает - мое мнение
- Дескриптор (который не содержит общей информации) правильный.
- Подпись (которая является атрибутом метода и содержит общую информацию) неверна. Соответствующая запись ConstPool для SIGNATURE метода ‹init›: «ConstantUTF8[(Ljava/util/list‹TE;›)V]»
- Javap в Java 6 не смотрит на подпись, только на дескриптор. (Моя догадка!)
Если кому-то интересно, я наткнулся на это, не используя JAVAP, просто просматривая файлы классов, я использую javap только для того, чтобы показать это. (поэтому вряд ли это ошибка javap).
Учитывать:
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;
}.....
Если вы посмотрите на вывод javap -cs для внутренних классов, они удивительно отличаются!
public org.benf.cfr.tests.InnerClassTest1$Inner1(org.benf.cfr.tests.InnerClassTest1, java.util.List); Подпись: (Lorg/benf/cfr/tests/InnerClassTest1;Ljava/util/List;)V
vs
общедоступный org.benf.cfr.tests.InnerClassTest2$Inner1(java.util.List‹E›); Подпись: (Lorg/benf/cfr/tests/InnerClassTest2;Ljava/util/List;)V
... в том, который использует дженерики, отсутствует неявный параметр для внешнего класса! (он правильно присутствует в InnerClassTest1).
Я не могу найти ничего в документации файла класса, чтобы объяснить это - кто-нибудь знает, почему это может быть?
Спасибо!
Ли.
Обновлять -
Я разместил файлы примеров по адресу http://www.benf.org/files/innerClassTest.tgz
Учитывая приведенный ниже ответ Шона, я попытался использовать javap на java 6 и увидел одинаковый вывод для обоих без общей информации - это заставляет меня поверить, что javap java 6 не отображает полную информацию о подписи?
Точный вывод, который я получаю, используя javap на 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
}
javap
их не печатает. Должна быть ошибка в Javap. - person Antimony   schedule 28.02.2013