Java : 곱슬 괄호가없고 계속되는 관계
-
20-09-2019 - |
문제
다음 Java 코드 조각이 있습니다
while (condition1){
switch (someinteger){
case 1:
if(condition2) continue;
// other stuff here
break;
// other cases here
}
}
모두 괜찮습니다. 클래스 파일을 생성 한 다음 무료 도구 (jd-gui)를 사용하여 디 컴파일하면 다음 코드를 다시 얻습니다.
while (condition1){
switch (someinteger){
case 1:
if(!condition2);
// other stuff here
break;
// other cases here
}
}
그래서 그것은 변합니다 if(condition2) continue;
에게 if(!condition2);
다른 IF 문 (중괄호 없음)에 대한 정보를 찾을 수 없었습니다. 누구든지 여기서 논리를 설명 할 수 있습니까? 미리 감사드립니다.
편집 : 더 많은 테스트를 수행했으며 디 컴파일러가 올바르게 작동하지 않습니다.
이전 코드는 다음과 같습니다.
public void strip(InputStreamReader f1, OutputStreamWriter f2) throws IOException{
int commentON=0, quoteON=0;
int b1;
while ((b1 = f1.read()) != -1){
switch ((char) b1){
case '\\':
if (commentON==0){
quoteON = 1;
break;
}
continue;
case '\n':
if (commentON>0){ commentON=0; continue; }
break;
case '%':
if (commentON>0) continue;
if (quoteON>0) { quoteON=0; break; }
commentON=2;
continue;
default:
if (commentON>0) continue;
if (quoteON>0) quoteON=0;
break;
}
f2.write(b1);
}
}
다음은 해독 된 코드입니다
public void strip(InputStreamReader f1, OutputStreamWriter f2) throws IOException
{
int commentON = 0; int quoteON = 0;
while ((b1 = f1.read()) != -1)
{
int b1;
switch ((char)b1)
{
case '\\':
if (commentON == 0);
quoteON = 1;
break;
case '\n':
if (commentON <= 0) break label109; commentON = 0; break;
case '%':
if (commentON <= 0);
if (quoteON > 0) { quoteON = 0; break label109: }
commentON = 2;
break;
}
if (commentON <= 0);
if (quoteON > 0) quoteON = 0;
label109: f2.write(b1);
}
}
모두를 귀찮게해서 죄송합니다. : p 가능하다면이 질문을 삭제하려고 노력할 것입니다.
해결책
디 컴파일러가 컴파일러의 코드 해석을 수행 할 때 원래 구문을 재구성하는 것은 거의 불가능합니다.
Java 컴파일러가 바이트 코드로 컴파일되는 Java 코드를 작성합니다.
그런 다음 디 컴파일러는 바이트 코드에서 Java 코드를 작성하려고 시도합니다.
두 코드 조각은 논리적으로 동일하기 때문에 디 컴파일러는 작업을 수행했습니다.
편집 (댓글보기) :
실제로, 디 컴파일러가 오류를 일으킨 것은 가능합니다 (그리고 이것은 매우 일반적입니다).
진술 if(!condition2);
본질적으로 전혀 영향을 미치지 않습니다 (제공된 조건 2는 실제로 부울이 아니며 의사 코드가 아닙니다).
그러므로 당신의 첫 번째 //other stuff here
에 관계없이 처리됩니다 condition2
코 컴파일 된 버전에서.
소환 된 코드가 올바르게 작동합니까?
다른 팁
몸이없는 if 문 ( "곱슬 괄호 없음")은 단순히 코드를 실행하지 않는 빈 IF 문입니다.
동일한 논리의 대안/표준 표현입니다. 디 컴파일러는 코드를 보존하지 않습니다.