컴파일러는 오토 옥싱을 위해 어떤 코드를 생성합니까?
-
03-07-2019 - |
문제
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
그것을 주목하는 것은 흥미 롭습니다 long
S가 긴 값을 -128..127
범위는 다른 적분 유형과 마찬가지로 Sun의 구현에 캐시됩니다.
나는 또한 내 사본에서 그것을 발견했다 Java 프로그래밍 언어, 그것은 말한다 char
값 \u0000
에게 \u00ff
캐시이지만 물론 사양 당 상한은 \u007f
(그리고이 경우 SUN JDK는 사양을 준수합니다).
나는 같은 것을 얻는 것이 좋습니다 Jad 그리고 코드를 많이 소집합니다. Java가 실제로하는 일에 대해 꽤 배울 수 있습니다.