我正在阅读XposedBridge的源代码。
当我阅读以下代码时,我很困惑
do {
label65: {
try {
((XC_MethodHook)callbacksSnapshot[beforeIdx]).beforeHookedMethod(param);
} catch (Throwable var18) {
log(var18);
param.setResult((Object)null);
param.returnEarly = false;
break label65;
}
if(param.returnEarly) {
++beforeIdx;
break;
}
}
} while(beforeIdx < callbacksLength);
据我所知,代码break label65
表示它会突破while
区域,但与label165
区域相同。标签lable165
的功能是什么?这是关于java的最佳实践,我不知道。
答案 0 :(得分:2)
这不被视为良好做法。
看来这个代码是由反编译器生成的,我怀疑标签和break
实际上是continue
语句,如果你需要, 完全正常提前退出循环并返回到开头。
答案 1 :(得分:1)
它被认为是Java中的不良做法,并且通常被认为类似于因创建意大利面条代码而臭名昭着的GOTO语句。
如果您需要在Java中使用带标签的break语句,通常意味着有一种更好的方法来构造逻辑/循环以避免它们。我个人觉得它们很混乱,特别是当它们被滥用时。
但是,它们与GOTO语句不同,因为您只能跳转到特定位置。并且它们可以在特定条件下完全打破嵌套循环。
答案 2 :(得分:0)
它就像GOTO声明一样,起着反复呼唤的作用。虽然这不是一个很好的做法。
答案 3 :(得分:0)
据我所知,代码中断标签65表示它会突破while区域,但它与label165区域相同。
实际上,它会打破标签声明的末尾。如果仔细查看括号,这意味着它会在
之前立即中断 ++beforeIdx;
在循环结束时。
标签lable165的功能是什么?
见上文。
这是关于java的最佳实践,我不知道。
这不是最佳做法。标签在这里使用的方式使代码难以理解,这是不好的做法。
事实上,如果这是手写代码,那么我怀疑它不会做作者认为它做的事情。如果你查看带有returnEarly
标志的东西,它将在异常处理程序中设置,然后在try ... catch
之后的语句中进行测试。但是处理程序也会破坏跳过if
语句的标签!
那可能是故意的,但如果是,那么这是一种非常模糊/混淆的编码逻辑的方式。
@cryslis写道:
请注意我的回答。我认为这是一个反编译的继续。
我还怀疑它是反编译的代码。奇怪的本地名称(label65
和var18
)是另一条线索。
但是,你说你发现源代码是一个Github仓库。这两件事并不是互相排斥的...但是如果有人反编译代码并将其上传到Github,那就非常笨拙,而且可能是非法的。我不想在没有明确证据的情况下指出手指。我在回购邮件中找不到label65
和var18
的源代码。
当然,反编译代码并将其上传到Github不是“最佳做法”。
如果您正在获取字节码并尝试通过反编译来理解它们,那么这也不是“最佳实践”。