2017-10-21 11 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

私は、ユーザーのJesperの提案に続き、このコードでて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ではありません。

のJava 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

関連する問題