문제

Java 컴파일러가 래퍼 클래스의 원시인을 자극 할 때는 무대 뒤에서 어떤 코드가 생성됩니까? 나는 그것이 호출되는 것을 상상하고있다 :

  • 래퍼의 () 메소드의 값
  • 래퍼의 생성자
  • 다른 마법?
도움이 되었습니까?

해결책

당신은 사용할 수 있습니다 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(), AutounBoxing이 호출됩니다 intValue() 주어진 Integer 물체. 실제로는 아무것도 없습니다. 단지 구문 설탕 일뿐입니다.

다른 팁

나는 래퍼의 생성자 대신 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);
    }
}

API 문서를 찾는 경우 정수#valueof (int), 당신은 그것이 JDK 1.5에 추가 된 것을 볼 수 있습니다. 모든 래퍼 유형 (아직 가지고 있지 않은)에는자가 옥싱을 지원하기 위해 유사한 방법이 추가되었습니다. 특정 유형의 경우 JLS에 설명 된대로 추가 요구 사항이 있습니다.

값이라면 박스형입니다 true, false, ㅏ byte, ㅏ char 범위 안에서 \u0000 에게 \u007f, 또는 int 또는 short 그 사이의 번호 -128 그리고 127, 그럼 R1 그리고 R2 두 개의 권투 변환 결과가 되십시오 . 항상 그렇습니다 R1 == R2. §5.1.7

그것을 주목하는 것은 흥미 롭습니다 longS가 긴 값을 -128..127 범위는 다른 적분 유형과 마찬가지로 Sun의 구현에 캐시됩니다.

나는 또한 내 사본에서 그것을 발견했다 Java 프로그래밍 언어, 그것은 말한다 char\u0000 에게 \u00ff 캐시이지만 물론 사양 당 상한은 \u007f (그리고이 경우 SUN JDK는 사양을 준수합니다).

나는 같은 것을 얻는 것이 좋습니다 Jad 그리고 코드를 많이 소집합니다. Java가 실제로하는 일에 대해 꽤 배울 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top