Какой код компилятор генерирует для автоупаковки?

Вы можете использовать SYSTEM_USER, если запрос выполняется на SQL Server, который будет извлекать имя пользователя, подключенное к базе данных (для этого убедитесь, что вы не используете фиксированное имя пользователя в строке соединения)

29
задан Craig P. Motlin 3 January 2009 в 05:32
поделиться

4 ответа

Можно использовать javap инструмент, чтобы лично убедиться. Скомпилируйте следующий код:

public class AutoboxingTest
{
    public static void main(String []args)
    {
        Integer a = 3;
        int b = a;
    }
}

, Чтобы скомпилировать и демонтировать:

javac AutoboxingTest.java
javap -c AutoboxingTest

вывод:

Compiled from "AutoboxingTest.java"
public class AutoboxingTest extends java.lang.Object{
public AutoboxingTest();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_3
   1:   invokestatic    #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   4:   astore_1
   5:   aload_1
   6:   invokevirtual   #3; //Method java/lang/Integer.intValue:()I
   9:   istore_2
   10:  return

}

Таким образом, как Вы видите, автоупаковка вызывает статический метод Integer.valueOf(), и автораспаковывание вызывает intValue() на, учитывая Integer объект. Нет ничего иного, действительно - это - просто синтаксический сахар.

45
ответ дан Adam Rosenfield 14 October 2019 в 07:54
поделиться

Я придумал модульный тест, который доказывает, что Integer.valueOf () называют вместо конструктора обертки.

import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;

import org.junit.Test;

public class Boxing {
    @Test
    public void boxing() {
        assertSame(5, 5);
        assertNotSame(1000, 1000);
    }
}
9
ответ дан Craig P. Motlin 14 October 2019 в 07:54
поделиться

Я рекомендовал бы получить что-то как , вруб и декомпилироваться кодирует много. Можно узнать вполне немного о какой на самом деле выполнение Java.

1
ответ дан Dustin 14 October 2019 в 07:54
поделиться

При поиске документа API для [1 116] Integer#valueOf (интервал) Вы будете видеть, что это было добавлено в JDK 1.5. Всем типам обертки (который уже не имел их) добавили похожие методы для поддержки автоупаковки. Для определенных типов существует дополнительное требование, как описано в JLS:

, Если значение упаковываемый p true, false, byte, char в диапазоне \u0000 к \u007f, или int или short число между -128 и 127, то позволен r1 и r2 быть результатами каких-либо двух преобразований упаковки [1 123] p. Всегда имеет место что r1 == r2. В§5.1.7

интересно отметить, что long с не подвергаются тому же требованию, хотя значения Long в эти -128..127 диапазон кэшируются в реализации Sun, точно так же, как другие целочисленные типы.

я также просто обнаружил, что в моей копии Язык программирования Java , это говорит char, значения от [1 113] до [1 114] кэшируются, но конечно верхний предел на спецификацию \u007f (и JDK Sun соответствует спецификации в этом случае).

4
ответ дан Alan Moore 14 October 2019 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: