为什么要将 true false 变量声明为 int 类型?
why would you want to declare a true false variable as type int?
下面的代码来自我在我的应用程序中使用的 SDK jar 中的 类 之一。下面的indexSize、bestWidth等是如何编译成int类型的?
config = this.mCamera.getParameters();
int indexSize = false;
int bestWidth = false;
int bestHeight = false;
int maxRes = false;
ZZZCLog.d("Camera supported sizes");
List<Size> supportedSizes = config.getSupportedPreviewSizes();
for(int i = supportedSizes.size() - 1; i >= 0; --i) {
ZZZCLog.d(((Size)supportedSizes.get(i)).width + " " + ((Size)supportedSizes.get(i)).height + " aspect ratio: " + (double)((Size)supportedSizes.get(i)).width / (double)((Size)supportedSizes.get(i)).height);
}
config = this.mCamera.getParameters();
ZZZCLog.d("Default preview size: " + config.getPreviewSize().width + "," + config.getPreviewSize().height);
Size bestSize = this.getBestPreviewSize(config, width, height);
int bestWidth = bestSize.width;
int bestHeight = bestSize.height;
ZZZCLog.d("Requesting preview size: " + bestWidth + "," + bestHeight);
config.setPreviewSize(bestWidth, bestHeight);
config.set("video-size", "" + bestWidth + "x" + bestHeight);
你不能相信反编译的 Java 代码。
在内部,Java 字节码将布尔值视为整数。你可以编译这个 class:
class Test {
public void foo() {
boolean myBoolean = false;
}
public void bar() {
int myInt = 0;
}
}
然后检查 javap -c Test
输出:
public void foo();
Code:
0: iconst_0
1: istore_1
2: return
public void bar();
Code:
0: iconst_0
1: istore_1
2: return
如您所见,int
和 boolean
成为完全相同的代码。
反编译器会尽力从基于堆栈的字节码中重建有效的源代码,但即使对于带有调试信息的未优化代码,这也是一个难题,因此它并不总是正确的。
下面的代码来自我在我的应用程序中使用的 SDK jar 中的 类 之一。下面的indexSize、bestWidth等是如何编译成int类型的?
config = this.mCamera.getParameters();
int indexSize = false;
int bestWidth = false;
int bestHeight = false;
int maxRes = false;
ZZZCLog.d("Camera supported sizes");
List<Size> supportedSizes = config.getSupportedPreviewSizes();
for(int i = supportedSizes.size() - 1; i >= 0; --i) {
ZZZCLog.d(((Size)supportedSizes.get(i)).width + " " + ((Size)supportedSizes.get(i)).height + " aspect ratio: " + (double)((Size)supportedSizes.get(i)).width / (double)((Size)supportedSizes.get(i)).height);
}
config = this.mCamera.getParameters();
ZZZCLog.d("Default preview size: " + config.getPreviewSize().width + "," + config.getPreviewSize().height);
Size bestSize = this.getBestPreviewSize(config, width, height);
int bestWidth = bestSize.width;
int bestHeight = bestSize.height;
ZZZCLog.d("Requesting preview size: " + bestWidth + "," + bestHeight);
config.setPreviewSize(bestWidth, bestHeight);
config.set("video-size", "" + bestWidth + "x" + bestHeight);
你不能相信反编译的 Java 代码。
在内部,Java 字节码将布尔值视为整数。你可以编译这个 class:
class Test {
public void foo() {
boolean myBoolean = false;
}
public void bar() {
int myInt = 0;
}
}
然后检查 javap -c Test
输出:
public void foo();
Code:
0: iconst_0
1: istore_1
2: return
public void bar();
Code:
0: iconst_0
1: istore_1
2: return
如您所见,int
和 boolean
成为完全相同的代码。
反编译器会尽力从基于堆栈的字节码中重建有效的源代码,但即使对于带有调试信息的未优化代码,这也是一个难题,因此它并不总是正确的。