解决方案 »

  1.   

    楼主对方法内联的概念理解有误,原代码如下:class A
    {
    int value;
     public final int get(){
         return value;
       }
    }public class B
    {
    public void sum()
    {
    A a=new A(); 
    int x=a.get();
    int y = a.get();
    int sum= x+y;
    }
    }方法内联后的代码如下:class A
    {
    int value;
     public final int get(){
         return value;
       }
    }public class B
    {
    public void sum()
    {
    A a=new A(); 
    int x=a.value;
    int y = a.value;
    int sum= x+y;
    }
    }
    Java编译器会对编译的类进行类继承关系分析,当确认class A的方法get只有一个版本(不是抽象方法也没有重写,我是直接定义final达到此效果),就会进行方法内联编译优化。楼主的代码例子应该是属于Java虚拟机的运行优化,System.out.println(i);,应该属于热点代码,虚拟机可能会将这个代码编译本地代码来执行。
      

  2.   

    学习看看     MARK                 
      

  3.   

    谢谢2楼的朋友我可不可以这么理解你的意思:
    我得到的反编译的代码,是编译器已经优化好了的代码,
    而无法根据这个结果,反推回本身源代码的样子。
    另外:
    我那个System.out.println只是个例子,代表“在这个位置有一些操作”
    并不是实际真正的代码。呵呵是我没说清楚,我检讨
      

  4.   


    嗯,
    这个优化是标准java编译器本身自带的呢?
    还是第三方编译器的功能呢?类似以前tomcat用另外的jsp编译器(名字忘了)处理jsp文件那样
      

  5.   


    嗯,
    这个优化是标准java编译器本身自带的呢?
    还是第三方编译器的功能呢?类似以前tomcat用另外的jsp编译器(名字忘了)处理jsp文件那样刚查了一下书,发现找不到这个说法的出处了。。不过我觉得应该是发生在编译期间的优化吧,应该是由编译器带来的
      

  6.   

    反编译后的代码是优化后的代码,另外你的System.out.println其实也是代表代码块,比如println方法的版本有很多,你看一下PrintStream的源码,里面重载了很多println方法,所以无法确认方法,需要运行时才能确认方法版本,所以不会有内联优化,相反运行时优化可能会有针对频繁执行的代码(如循环多次的System.out.println),Java虚拟机会对此热点代码进行优化(利用JIT技术编译成本地代码)。
      

  7.   


    嗯,
    这个优化是标准java编译器本身自带的呢?
    还是第三方编译器的功能呢?类似以前tomcat用另外的jsp编译器(名字忘了)处理jsp文件那样Java的编译器有:
    ECJ(eclipse的编译器)、JIT编译器(Hotspot虚拟机的C1、C2编译器),AOT编译器(GCJ、JET等)。
      

  8.   


    嗯,
    这个优化是标准java编译器本身自带的呢?
    还是第三方编译器的功能呢?类似以前tomcat用另外的jsp编译器(名字忘了)处理jsp文件那样Java的编译器有:
    ECJ(eclipse的编译器)、JIT编译器(Hotspot虚拟机的C1、C2编译器),AOT编译器(GCJ、JET等)。都没听说过
      

  9.   


    嗯,
    这个优化是标准java编译器本身自带的呢?
    还是第三方编译器的功能呢?类似以前tomcat用另外的jsp编译器(名字忘了)处理jsp文件那样Java的编译器有:
    ECJ(eclipse的编译器)、JIT编译器(Hotspot虚拟机的C1、C2编译器),AOT编译器(GCJ、JET等)。都没听说过
    恩,主要是我们无法在程序中使用,只能了解,内联优化跟代码的重复性无关,只跟方法的版本有关,重复性代码是Java虚拟机的热点追踪技术和即时编译JIT有关。内联优化是编译器的优化、JIT是运行时的Java虚拟机的优化。