2015-07-31 3 views
2

Я компиляция это очень простой и наивный код Java с Eclipse, и Javac:Затмение/Javac разный байткод

package anypackagename; 

public class Foo { 

    public static void bar(Class<?> cls) { 
     while (cls != null) { 
      final Class<?>[] interfaces = cls.getInterfaces(); 

      // ... 

      cls = cls.getSuperclass(); 
     } 
    } 
} 

Вопрос заключается в том, что я получаю различный байткод с различными инструментами.

Собран с Eclipse, я получил:

public static void bar(java.lang.Class<?>); 
    Code: 
     0: goto   13 
     3: aload_0 
     4: invokevirtual #18     // Method java/lang/Class.getInterfaces:()[Ljava/lang/Class; 
     7: astore_1 
     8: aload_0 
     9: invokevirtual #24     // Method java/lang/Class.getSuperclass:()Ljava/lang/Class; 
     12: astore_0 
     13: aload_0 
     14: ifnonnull  3 
     17: return 
    LineNumberTable: 
     line 6: 0 
     line 7: 3 
     line 11: 8 
     line 6: 13 
     line 13: 17 

однако, составленный с JAVAC я получил:

public static void bar(java.lang.Class<?>); 
    Code: 
     0: aload_0 
     1: ifnull  17 
     4: aload_0 
     5: invokevirtual #2     // Method java/lang/Class.getInterfaces:()[Ljava/lang/Class; 
     8: astore_1 
     9: aload_0 
     10: invokevirtual #3     // Method java/lang/Class.getSuperclass:()Ljava/lang/Class; 
     13: astore_0 
     14: goto   0 
     17: return 
    LineNumberTable: 
     line 6: 0 
     line 7: 4 
     line 11: 9 
     line 12: 14 
     line 13: 17 

по-видимому, «Eclipse реализовала свой собственный компилятор под названием, как Eclipse, компилятор Java (СЕС). " (What is the difference between javac and the Eclipse compiler?) ... Я хотел бы знать, есть ли какой-либо вариант использования в Eclipse, чтобы иметь тот же байт-код, созданный javac.

+1

2 байтовых кода фактически одинаковы .. Таким образом, не имеет значения, какой компилятор вы используете :) – TheLostMind

+1

Конечно! Используйте ant или maven для сборки. Кроме того, убедитесь, что вы используете один и тот же уровень компилятора в обоих. –

+0

Mmm @Jon: Не уверен, что это дублируется с помощью http://stackoverflow.com/questions/14186091/how-to-configure-eclipse-to-compile-using-oracle-javac-1-7-0-09: В этом вопросе на самом деле нет ответа, рассказывающего, как настроить Eclipse для этого. – Javier

ответ

0

Имеет ли значение, какой байт-код вы используете? Честно, наверное, нет. Они будут делать то же самое с относительно одинаковой скоростью.

Теперь, если вы хотите использовать компилятор javac вместо ECJ, вы можете установить это в параметрах времени выполнения, и ваш код будет просто скомпилирован с помощью javac. Для ECJ нет причин, чтобы это можно было сделать, и не было никакого способа сделать это, поскольку коммерческая версия javac (я считаю) закрыта.

Просто переключитесь на javac в вариантах исполнения, если это имеет значение.

+0

Не могли бы вы уточнить, где вы можете сделать это в настройках или в свойствах проекта? – Javier

+0

да, это важно. представьте, что вы используете инструмент покрытия, такой как Eclemma (http://www.eclemma.org/). потому что байт-код, скомпилированный с Eclipse, не включает строку 12, Eclemma или любой другой инструмент, который полагается на байт-код, не сможет назначить покрытие для этой конкретной линии. – josecampos

+0

@josecampos Очевидно, что eclemma хорошо интегрирована с Eclipse и должна хорошо знать шаблоны кода, созданные ECJ. Теперь, почему вас интересует покрытие кода '' '? Здесь нечего выполнять. Он имеет то же самое покрытие, что и в предыдущем заявлении. «Goto» в выходе javac является чисто искусственным, как и исходный «goto» в выходе ecj. Что касается наблюдаемого поведения, то оба компилятора идентичны (по модулю ошибок).Поведение, которое вы хотите отслеживать, не воспринимается семантикой Java. –