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);,应该属于热点代码,虚拟机可能会将这个代码编译本地代码来执行。
------解决方案--------------------
刚查了一下书,发现找不到这个说法的出处了。。不过我觉得应该是发生在编译期间的优化吧,应该是由编译器带来的
------解决方案--------------------可以自己写代码试试的。
使用内联函数自定义,实现最简单的效果,比如打印。
编译。
使用你的反编译工具试试自己的代码不就行了。