Каква е разликата на java .class файловете в различните компилатори, версии, зависимости?

Здравейте, чудех се колко файлове на Java клас се променят в различните компилатори. И така, колко се променят действителните байтове, ако .java файлове се компилират от Sun JDK 1.4, 1.5 1.6 или дори IBM JDK. Знам, че файловете на класа могат да бъдат различни по отношение на информацията за отстраняване на грешки и обфускацията, но нека приемем за въпроса, че тези опции са еднакви, така че информацията за отстраняване на грешки е включена, без обфускация. Ако стартирам MD5 или SHA-1 има върху .class файл, който е компилиран от JDK 1.4, хешът ще бъде ли различен, ако го компилирам в JDK 1.5, но насочен към 1.4, какво, когато насочвам към JDK 1.5?

Също така свързано с това, променя ли се двоичният файл на клас файл, когато се използват различни зависимости, или може ли двоичният файл на клас файл да се промени въз основа на неговите зависимости?

И не на последно място има ли програмни начини за анализиране на метаданните на .class файл, за да се идентифицира версията на компилатора и/или превключвателите, които са били използвани при компилирането му?


person AGrunewald    schedule 27.03.2011    source източник
comment
MD5 и SHA-1 са дефинирани по начин да променят около половината от техните изходни битове, ако промените един бит на входа. С други думи, ако тези клас файлове се различават дори в един байт, ще получите напълно различни MD5 или SHA-1.   -  person pajton    schedule 28.03.2011


Отговори (3)


Компилаторите на Java имат доста свобода, когато създават класове и байт код от източника. Те могат да пренаредят методите, да пренаредят постоянния пул (с имена на класове, имена на методи и низове - това също води до различен байт код на метода) и да пренаредят действителните команди с байт код, стига резултатът при изпълнението им да е същият.

Така че използването на MD5 или подобни хешове, за да се докаже, че два файла на клас идват от един и същ източник, не е наистина разумно.

person Paŭlo Ebermann    schedule 28.03.2011

За формата на клас файловете вижте http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html

Да, клас файловете могат и обикновено се променят в зависимост от това кой конкретен компилатор се използва за изграждането им. Има много подробности за внедряването на компилатора, които ще доведат до различни байт кодове - напр. изброяване на зависимости в различни редове в масивите интерфейси[] или полета[]. Освен това компилаторите са свободни да използват различни оптимизации.

Добавянето или премахването на израз "импортиране" не променя непременно файла на класа - но използването на клас в един пакет вместо в друг със сигурност ще го направи. Не съм сигурен дали това отговаря на втория ви въпрос.

Не вярвам, че компилаторите оставят самоличността си във файловете на класа. Всеки подобен анализ ще трябва да бъде индиректен и най-вероятно евристичен (по линия на разказване на автора на книга по нейния стил) - освен ако нямате изходния код и можете да компилирате с всеки компилатор и да сравнявате.

person jsalvata    schedule 28.03.2011
comment
добавянето или премахването на импорт per se не променя зависимостите. Всъщност импортът изобщо не е зависимост. Действителната изрична или неявна употреба на външен клас или член на класа създава зависимостта. (И има няколко начина, по които можете да имате зависимост без импортиране.) - person Stephen C; 28.03.2011

Paŭlo отговори добре на въпроса ви относно хеширането. Колкото до другия ти въпрос:

Също така свързано с това, променя ли се двоичният файл на клас файл, когато се използват различни зависимости, или може ли двоичният файл на клас файл да се промени въз основа на неговите зависимости?

да Файлът на класа съдържа подписи за всички извиквани методи и те може да са се променили. Обмисли:

void test() {
    Foo.bar(1,2);
}

където Foo във версия 1 се определя от:

class Foo {
    public static void bar(int x, int y) {
        // do something
    }
}

и във версия 2 от:

class Foo {
    public static <T> T bar(T... ts) {
        // do something
    }
}
person meriton    schedule 28.03.2011