最近在对拿到的jar包做反编译,发现一个现象:反编译后的代码中有int a = false;的代码。这种明显的代码错误是怎么回事呢?查阅资料后发现,这是由于编译器对代码进行了优化,对int变量使用true,false优化,而反编译时不能对未使用到的变量反编译回来。
写完的java文件在编译成class文件时,编译器会对java文件进行优化。例如int变量。
int a = 0;
int b = 10;
int c = -10;
int d = 20;
System.out.print(d);
上述代码在编译后,class文件中对应如下:
int a = false;
int b = true;
int c = true;
int d = true;
System.out.print(d);
true代表该int变量内的值不为0,false代表0。反编译后,java代码如下:
int a = false;
int b = true;
int c = true;
int d = 20;
System.out.print(d);
即只有后面被使用到的变量才能被反编译,没有使用的变量无法被反编译。