2017-10-21 21 views
1

javac는 인라인 된 경우 개인 메소드를 생략합니까? 예를컴파일러는 사용되지 않는 개인 메소드를 최적화할까요?

public class Test { 
    public static void main(String[] args){ 
    System.out.println(sayHello()); 
    } 
    private static String sayHello(){ 
    return "Hello World"; 
    } 
} 

그러나이 방법은 다음 반사에 의해 액세스되는 경우에 대한 ?

System.out.println(Test.class.getMethod("sayHello").invoke(null)); 

어떻게 컴파일러는 방법을 인라인 및 제거 여부를 알 수 있습니까?

+3

이 메소드가 컴파일러에 의해 인라인되고 있다고 생각합니까? 그것은 인라이닝을하지 않습니다. 인라이닝은 런타임시 JIT 컴파일러에서 발생할 수 있습니다. –

+1

당신은'javap'을 사용하여 컴파일 된 클래스를 역 어셈블함으로써 스스로 시도 할 수 있습니다. 대부분 방법을 폐기하지 않을 것입니다. – Jesper

+1

컴파일러 최적화는 결코 동작을 변경하지 않습니다. – 4castle

답변

2

나는 사용자 예스퍼의 제안을 따라이 코드에은 javap 사용하고 있습니다 :

package stackoverflow; 

public class CompilerOptimize { 
    public static void main(String[] args){ 
     System.out.println(sayHello()); 
    } 

    private static String sayHello(){ 
     return "Hello World"; 
    } 

    private static void bananas() { 
     System.out.println("Monkey!"); 
    } 
} 

방법 sayHello를 사용하고, bananas는 없습니다.

자바 8 컴파일 된 클래스에 -p 매개 변수은 javap 실행의 결과는 다음과 같습니다

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

    public static void main(java.lang.String[]); 
    Code: 
     0: getstatic  #2     // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: invokestatic #3     // Method sayHello:()Ljava/lang/String; 
     6: invokevirtual #4     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     9: return 

    private static java.lang.String sayHello(); 
    Code: 
     0: ldc   #5     // String Hello World 
     2: areturn 

    private static void bananas(); 
    Code: 
     0: getstatic  #2     // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: ldc   #6     // String Monkey! 
     5: invokevirtual #4     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     8: return 
} 

방법 bananas은 (sayHello도있다) 바이트 코드 주석에 언급되어있다.

컴파일러는 사용되지 않는 개인 메소드를 최적화 할 예정입니까?

아니요.

+1

@JB Nizet : 나에게 수치 스럽다. -p 매개 변수가 누락되었음을 지적 해 주셔서 감사합니다. 너는 신용을받을 만하다. –

+0

답변 해 주셔서 감사합니다. javac이 최적화를하지 않았다는 것을 결코 깨닫지 못했습니다! 그래도 놓친 기회처럼 보입니다. – vikarjramun