有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

编译器优化反编译工具修改的源代码。java中的类文件

我使用了djjava反编译工具获取源代码。java中的类文件。它生成的源文件的代码与我之前在原始源程序中编写的代码不同

我的疑问是:

  1. 这是因为JVM在创建 提高执行速度的目标代码&;减少空间和时间 复杂性
  2. 或者反编译工具修改。类文件代码以生成 又是源程序

见原始源程序如下:

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)));
    }
}

共 (2) 个答案

  1. # 1 楼答案

    Java编译器几乎不优化生成的代码(尽管有一些优化,比如计算常量表达式和内联某些静态最终字段)

    但问题是,你不能指望从现实中得到你开始使用的确切代码。Java不是脚本语言,代码实际上被编译成字节码——原始文本源代码不存储在类文件中的任何地方

    您发布的输出与您可能期望的一样好。你总是会丢失一些东西,比如空白、注释和格式,因为它们根本没有存储在类文件中。对于底部的循环,显然有多种方法可以编写相同的代码,而反编译器只是选择了一种不同的方式来表达相同的代码。由于无法判断所有可能的等效代码样式中最初使用的是哪一种,反编译器只能猜测

    这可能只是一种启发的结果,人们通常为循环而写,而不是像你最初那样为循环而写。在这种特殊情况下,没有人会将print语句放在这样的for循环表达式中,但启发法并不完美

  2. # 2 楼答案

    Java编译器只做最小的优化

    大多数优化只由JIT编译器完成。(因为它拥有关于平台和运行时环境的最多信息。)

    for-loops and while-loops use an identical pattern in byte code. This is not surprising because all while-loops can be re-written easily as an identical for-loop

    http://blog.jamesdbloom.com/JavaCodeToByteCode_PartOne.html

    由于在字节码版本中,for循环和while循环看起来相同,反编译器可能会将其反编译为while循环