【发布时间】:2015-03-29 05:18:16
【问题描述】:
我使用DJ JAVA DECOMPILER工具从java中的.class文件中取回源代码。它生成的源文件与我之前在原始源程序中编写的代码相比具有不同的代码。
我的疑问是:
- 这是因为JVM在创建之前做了代码优化 目标代码以提高执行速度并减少空间和时间 复杂性?
- 或者反编译工具修改.class文件代码生成 又是源程序?
看到原来的源程序是这样的:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class Test1 {
/**
* @param args
* @throws SQLException
* @throws ClassNotFoundException
*/
public static void main(String args[]) throws SQLException, ClassNotFoundException{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con= DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:choxx","choxx","choxx");
if(con==null){
System.out.println("not established");
}else{
System.out.println("established");
}
Statement st= con.createStatement();
//st.executeQuery("create table student if not exists(sno number(10), name varchar2(30), addr varchar(20))");
if(st!=null){
System.out.println("table created..");
}
st.execute("delete from student where addr='hyderabad'");
ResultSet rs= st.executeQuery("select * from student");
while(rs.next()){
System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getString(3));
}
}
}
反编译后得到的是:
// Decompiled by DJ v3.12.12.99 Copyright 2015 Atanas Neshkov Date: 29-03-2015 10:55:31
// Home Page: http://www.neshkov.com/dj.html - Check often for new version!
// Decompiler options: packimports(3)
// Source File Name: Test1.java
import java.io.PrintStream;
import java.sql.*;
public class Test1
{
public Test1()
{
}
public static void main(String args[])
throws SQLException, ClassNotFoundException
{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:choxx", "choxx", "choxx");
if(con == null)
System.out.println("not established");
else
System.out.println("established");
Statement st = con.createStatement();
if(st != null)
System.out.println("table created..");
st.execute("delete from student where addr='hyderabad'");
for(ResultSet rs = st.executeQuery("select * from student"); rs.next(); System.out.println(rs.getInt(1) + " " + rs.getString(2) + " " + rs.getString(3)));
}
}
【问题讨论】:
-
您能解释一下您观察到的任何变化吗?
-
所以它已经完成了编译器的优化目的。如果您比较您在源代码中完成的 for 循环和反编译版本中的 while 循环,您就会明白。
-
查看我在问题中编辑的示例。在原始源代码中,我使用了 while 循环。后来在反编译后我看到while循环被替换为for循环并且代码仍然工作正常。
标签: java compiler-optimization decompiler .class-file