日期:2014-05-20  浏览次数:21028 次

java代码可以内联编译吗?
最近在反编译前人留下的程序
发现反编译的代码里,有很多程序里都执行了相同的一段代码。
比如:
在A.java的a方法里,是这样的

class A{
   public static void a(){
      for (int i = 0; i < 100; i++){
         System.out.println(i);
      }
      // a's job
   }
}

然后,在B.java里面的b方法里,也有类似的代码,比如

class B{
   public static void b(){
      for (int i = 0; i < 100; i++){
         System.out.println(i);
      }
      // b's job
   }
}


如果有1个2个也就算了,
但是,我看了不下10处,都有这个

      for (int i = 0; i < 100; i++){
         System.out.println(i);
      }


所以我想知道,
难道当初开发者是一个一个拷贝的?
还是说java的编译器有什么参数,
可以让一个方法“内联”编译到另一个方法里呢?
或者是我反编译器的问题?

还是我钻牛角尖了,本身只可能拷贝粘贴才能达到这样的效果。。。
希望大神给我指点一下迷津。
谢谢了


------解决方案--------------------
楼主对方法内联的概念理解有误,原代码如下:

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);,应该属于热点代码,虚拟机可能会将这个代码编译本地代码来执行。

------解决方案--------------------
引用:
Quote: 引用:

没有深究过,但是从读到的书里介绍的来看,是有内联这个优化的


嗯,
这个优化是标准java编译器本身自带的呢?
还是第三方编译器的功能呢?

类似以前tomcat用另外的jsp编译器(名字忘了)处理jsp文件那样


刚查了一下书,发现找不到这个说法的出处了。。不过我觉得应该是发生在编译期间的优化吧,应该是由编译器带来的
------解决方案--------------------
可以自己写代码试试的。

使用内联函数自定义,实现最简单的效果,比如打印。
编译。

使用你的反编译工具试试自己的代码不就行了。