做了一个java5.0/6.0的反编译工具.随意试用吧.

Java5.0/6.0反编译工具

做了一个java5.0/6.0的反编译工具.随意试用吧.

其实就是做了一个外壳.对class文件修改版本后调用jad来反编译.

调用jad的过程用SW_SHOW显示到前台,目的是为了目标文件中已经存在相同的java文件,比如上一次

已经反编译了一次,没有删除时,jad提示要覆盖,如果在后台没有手工确认jad进程就死在进程列表中了.

最好是在反编译前前目标文件夹清空.

另外没有将临时文件夹自动清空是因为在循环调用ShellExecute时,WaitForSingleObject仍然会产生冲突.

而且程序递归牧举一次临时目录还不如手动在tmp上右键->删除来得方便.

使用的时候把jad5.exe和jad.exe放在相同目录下或将jad.exe放在PATH环境变量中.选择class所在文件夹和目标

文件夹运行即可.

http://www.cnjbb.org/attachment/56/50307/65187/2333/release.rar

以下是主要用到的递归函数.调用时传入用户选择的class文件的目录,也就是函数中的

this->srcDir.

函数中的this->destDir是目标目录.

void Cjad5Dlg::process(CString dir){

WIN32_FIND_DATA fd;
ZeroMemory(&fd, sizeof(WIN32_FIND_DATA));
HANDLE hFile;
hFile = FindFirstFile(dir+"//*",&fd);
do{
if(strcmp(fd.cFileName,".") && (strcmp(fd.cFileName,"..")) && (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)){
//是目录但不是"."和".."
process(dir+"//"+fd.cFileName);
}
else if( strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, ".."))//不是"."和"..",只能是文件
{
CString srcFile = dir+"//"+fd.cFileName;
CFile cf(srcFile,CFile::modeRead);
if(cf.GetFileName().Find(".class") > 0){//是class文件
CString path = dir.Mid(this->srcDir.GetLength());
CString destPath = this->destDir + path;
{ //我喜欢把需要即时消失的操作放在{}中
CFileFind cff;
if(!cff.FindFile(destPath)) SHCreateDirectoryEx(NULL,destPath,NULL);//mkdir -p
cff.Close();
}
CString tmpDir = this->destDir +"//tmp"+ path;
{
CFileFind cff;
if(!cff.FindFile(tmpDir)) SHCreateDirectoryEx(NULL,tmpDir,NULL);
cff.Close();
}
CFile cf1(tmpDir + "//" + fd.cFileName,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
//copy class文件以便修改版本
byte buf[512];
int x = cf.Read(buf,512);
if(x > 8){
buf[7] = 46;//修改为1.4版
cf1.Write(buf,x);
}
while(x = cf.Read(buf,512)){
cf1.Write(buf,x);
}
cf1.Close();
cf.Close();

ShellExecute(NULL,NULL,"jad.exe"," -s java "+tmpDir+"//"+fd.cFileName,destPath,SW_SHOW);
//调用jad返编译

}
else cf.Close();
}
}
while(FindNextFile(hFile,&fd));
}

### 不同类型除法运算结果分析 #### 整数除法 在 Java 中,当两个整数进行除法运算时,结果会自动取整,舍弃小数部分。例如: ```java public class Arithmetic2 { public static void main(String[] args) { int result = 10 / 3; System.out.println(result); // 输出 3 } } ``` 这里 `10 / 3` 的结果在数学上是约 3.33,但在 Java 的整数除法中,结果为 3,小数部分被直接舍弃。 #### 浮点数除法 当参与除法运算的操作数中有一个是浮点数时,结果将是浮点数。例如: ```java public class Arithmetic2 { public static void main(String[] args) { double result = 10.0 / 3; System.out.println(result); // 输出约 3.3333333333333335 } } ``` 此时,除法运算会得到一个近似的浮点数结果。 ### 可能存在的问题及解决办法 #### 除数为零 如果在整数或浮点数除法中,除数为零,会出现不同的情况。 - **整数除法**:当除数为零进行整数除法时,会抛出 `java.lang.ArithmeticException` 异常。例如: ```java public class Arithmetic2 { public static void main(String[] args) { int result = 10 / 0; // 会抛出 ArithmeticException System.out.println(result); } } ``` 解决办法是在进行除法运算之前,检查除数是否为零。可以采用以下方式: ```java public class Arithmetic2 { public static void main(String[] args) { int divisor = 0; if (divisor == 0) { System.out.println("除数不能为零"); } else { int result = 10 / divisor; System.out.println(result); } } } ``` - **浮点数除法**:当除数为零进行浮点数除法时,不会抛出异常,而是会得到特殊的结果。如果被除数为正数,结果为 `Infinity`;如果被除数为负数,结果为 `-Infinity`;如果被除数也为零,结果为 `NaN`(Not a Number)。例如: ```java public class Arithmetic2 { public static void main(String[] args) { double positiveResult = 10.0 / 0; double negativeResult = -10.0 / 0; double nanResult = 0.0 / 0; System.out.println(positiveResult); // 输出 Infinity System.out.println(negativeResult); // 输出 -Infinity System.out.println(nanResult); // 输出 NaN } } ``` 对于浮点数除法,同样可以在运算前检查除数是否为零,避免出现特殊结果影响后续程序逻辑。 #### 整数溢出 在进行整数运算时,如果结果超出了整数的取值范围,会发生整数溢出。虽然这不是直接的除法问题,但在某些复杂运算中可能会影响除法结果。例如: ```java public class Arithmetic2 { public static void main(String[] args) { int maxInt = Integer.MAX_VALUE; int result = (maxInt + 1) / 2; System.out.println(result); // 输出 -1073741824,不是预期结果 } } ``` 解决办法是使用更大的数据类型,如 `long` 或 `BigInteger` 来避免整数溢出。例如使用 `long` 类型: ```java public class Arithmetic2 { public static void main(String[] args) { long maxInt = Integer.MAX_VALUE; long result = (maxInt + 1) / 2; System.out.println(result); // 输出 1073741824 } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值