2017-02-16 3 views
1

Вот простой класс.Не удается увидеть целочисленное значение в постоянном пуле

public class Test{ 
    private int a = 10; 
    private float b = 20.0F; 
} 

Используя javap -v -l Test.class команду, чтобы увидеть структуру файла класса. В разделе Constant pool я должен видеть все константы класса. Тем не менее, я могу найти значение float равным 20.0f, но не может найти значение int.

public class Test 
    minor version: 0 
    major version: 52 
    flags: ACC_PUBLIC, ACC_SUPER 
Constant pool: 
    #1 = Methodref   #6.#17   // java/lang/Object."<init>":()V 
    #2 = Fieldref   #5.#18   // Test.a:I 
    #3 = Float    20.0f 
    #4 = Fieldref   #5.#19   // Test.b:F 
    #5 = Class    #20   // Test 
    #6 = Class    #21   // java/lang/Object 
    #7 = Utf8    a 
    #8 = Utf8    I 
    #9 = Utf8    b 
    #10 = Utf8    F 
    #11 = Utf8    <init> 
    #12 = Utf8    ()V 
    #13 = Utf8    Code 
    #14 = Utf8    LineNumberTable 
    #15 = Utf8    SourceFile 
    #16 = Utf8    Test.java 
    #17 = NameAndType  #11:#12  // "<init>":()V 
    #18 = NameAndType  #7:#8   // a:I 
    #19 = NameAndType  #9:#10   // b:F 
    #20 = Utf8    Test 
    #21 = Utf8    java/lang/Object 
{ 
    public Test(); 
    descriptor:()V 
    flags: ACC_PUBLIC 
    Code: 
     stack=2, locals=1, args_size=1 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: aload_0 
     5: bipush  10 
     7: putfield  #2     // Field a:I 
     10: aload_0 
     11: ldc   #3     // float 20.0f 
     13: putfield  #4     // Field b:F 
     16: return 
     LineNumberTable: 
     line 1: 0 
     line 2: 4 
     line 3: 10 
} 
SourceFile: "Test.java" 

Согласно документу https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4-140

я должен видеть CONSTANT_Integer в постоянном бассейне.

+0

Константа бассейн превратить небольшое целое число в более сложное значение, которое особенно полезно, если это значение появляется более одного раза при уменьшении кода. Малые целые числа не получают этого, так как они уже являются малыми целыми числами. –

ответ

3

Существуют специальные инструкции для загрузки небольших целочисленных значений (iconst_x для значений от -1 до 5, bipush x для байтовых значений и sipush x для коротких значений).

Константа пул используется только для целочисленных значений вне этого диапазона, то есть для чисел меньше -32768 или больше, чем 32767.

+0

Добавляя к тому же, попробуйте запустить код со значением int больше 32767. Вы находите это значение в пуле констант – Jayesh

+0

Спасибо за ваш ответ, я пробовал с 40000. значение, присутствующее в постоянном пуле. –

+2

В качестве дополнения, если вы объявляете реальную константу, то есть поле «final», которое немедленно инициализируется константой, вы всегда увидите соответствующий «CONSTANT_Integer» в пуле. – Holger

Смежные вопросы