编译器会优化未使用的私有方法吗?

时间:2017-10-21 15:30:58

标签: java javac compiler-optimization private-methods

如果内联的话,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));

编译器如何知道是否内联方法并将其删除?

1 个答案:

答案 0 :(得分: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!");
    }
}

使用方法sayHellobananas不是。

使用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
}

字节代码注释中提到了方法bananassayHello也存在)。

  

编译器会优化未使用的私有方法吗?

不是。