javac java编译-g

一.关于javac的-g
通过javac工具可以从.java文件编译成.class文件,编译后,一些信息可保留或不保留.其中编译参数g解析如下:
 -g                         生成所有调试信息
 -g:none                    不生成任何调试信息
 -g:{lines,vars,source}     只生成某些调试信息
 source 源文件调试信息
 lines 行号调试信息
 vars 本地变量调试信息

如果不使用-g来编译,只保留源文件和行号信息.个人理解相当于-g:source,lines
如果只使用-g来编译.个人理解相当于-g:source,lines,vars

TestJava.java文件

public class TestJava{  
    public void testMethod(String you,Integer me){  
        System.out.print(you);  
        System.out.print(me);  
    }  
    public static void main(String[] args){  
        System.out.print(123);  
    }  
}

情况1:
a.使用E:\>d:\jdk7\bin\javac TestJava.java编译
b.使用d:\webdesign\ide\jadclipse\jad TestJava.class反编译结果如下,发现局部变量信息已丢掉:

import java.io.PrintStream;  
  
public class TestJava  
{  
  
    public TestJava()  
    {  
    }  
  
    public void testMethod(String s, Integer integer)  
    {  
        System.out.print(s);  
        System.out.print(integer);  
    }  
  
    public static void main(String args[])  
    {  
        System.out.print(123);  
    }  
} 

情况2:
a.使用E:\>d:\jdk7\bin\javac -g TestJava.java或使用d:\jdk7\bin\javac -g:source,lines,vars TestJava.java编译
b.使用d:\webdesign\ide\jadclipse\jad TestJava.class反编译结果如下,发现三者信息都保留:

import java.io.PrintStream;  
  
public class TestJava  
{  
  
    public TestJava()  
    {  
    }  
  
    public void testMethod(String you, Integer me)  
    {  
        System.out.print(you);  
        System.out.print(me);  
    }  
  
    public static void main(String args[])  
    {  
        System.out.print(123);  
    }  
}  

情况3:
a.注释testMethod方法内二行代码,即现在的TestJava.java内容为

public class TestJava{  
    public void testMethod(String you,Integer me){  
        //System.out.print(you);  
        //System.out.print(me);  
    }  
    public static void main(String[] args){  
        System.out.print(123);  
    }  
}  

b.使用E:\>d:\jdk7\bin\javac -g TestJava.java或使用d:\jdk7\bin\javac -g:source,lines,vars TestJava.java编译
c.使用d:\webdesign\ide\jadclipse\jad TestJava.class反编译结果如下,发现vars信息都还是丢掉了:

import java.io.PrintStream;  
  
public class TestJava  
{  
  
    public TestJava()  
    {  
    }  
  
    public void testMethod(String s, Integer integer)  
    {  
    }  
  
    public static void main(String args[])  
    {  
        System.out.print(123);  
    }  
} 

二.扩展


Eclipse的编译设置如下图,其中蓝色框三选项对应上面的vars,lines,source是不难理解的.蓝色框下面的第四项,怎搞的就不深入研究了.如果我们使用spring mvc开发,勾上第一选项'添加变量属性到生成的类文件'是相当的重要.
比如controller方法:

@RequestMapping(value="/findById",method=RequestMethod.GET)  
public String findById(Model model,Integer id) {  
    User user=userService.findById(id);  
    model.addAttribute("user", user);  
    return "user/result";  
} 

如果请求过来的参数id=1,会发现spring无法将1的值映射到上面的id请求变量,并且spring mvc会抛异常.解决这样的方法有两种:
方法1.使用eclipse编译的时候就勾上上面的'添加变量属性到生成的类文件'选项去编译spring的controller.
方法2.使用spring的@RequestParam注解,比如@RequestParam("id")显式表明从请求过来的id参数值映射到这个变量去.


再有,如果使用ant进行编译也不要忘了使用debug="true",下面也是一个例子:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>  
<project basedir="." default="build" name="test">  
    <property environment="env"/>  
    <property name="JAVA_HOME" value="D:/jdk7"/>  
    <property name="ECLIPSE_HOME" value="D:/eclipseWeb"/>  
    <property name="javac.exe" value="${JAVA_HOME}/bin/javac" />  
    <property name="target" value="1.7"/>  
    <property name="source" value="1.7"/>  
    <path id="Maven Dependencies.libraryclasspath">  
        <pathelement location="../../mvnrepo/org/springframework/spring-webmvc/3.2.8.RELEASE/spring-webmvc-3.2.8.RELEASE.jar"/>  
        <pathelement location="../../mvnrepo/org/springframework/spring-beans/3.2.8.RELEASE/spring-beans-3.2.8.RELEASE.jar"/>  
        <pathelement location="../../mvnrepo/org/springframework/spring-context/3.2.8.RELEASE/spring-context-3.2.8.RELEASE.jar"/>  
        <pathelement location="../../mvnrepo/org/springframework/spring-aop/3.2.8.RELEASE/spring-aop-3.2.8.RELEASE.jar"/>  
        <pathelement location="../../mvnrepo/aopalliance/aopalliance/1.0/aopalliance-1.0.jar"/>  
        <pathelement location="../../mvnrepo/org/springframework/spring-core/3.2.8.RELEASE/spring-core-3.2.8.RELEASE.jar"/>  
        <pathelement location="../../mvnrepo/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar"/>  
        <pathelement location="../../mvnrepo/org/springframework/spring-expression/3.2.8.RELEASE/spring-expression-3.2.8.RELEASE.jar"/>  
        <pathelement location="../../mvnrepo/org/springframework/spring-web/3.2.8.RELEASE/spring-web-3.2.8.RELEASE.jar"/>  
        <pathelement location="../../mvnrepo/org/springframework/spring-orm/3.2.8.RELEASE/spring-orm-3.2.8.RELEASE.jar"/>  
        <pathelement location="../../mvnrepo/org/springframework/spring-jdbc/3.2.8.RELEASE/spring-jdbc-3.2.8.RELEASE.jar"/>  
        <pathelement location="../../mvnrepo/org/springframework/spring-tx/3.2.8.RELEASE/spring-tx-3.2.8.RELEASE.jar"/>  
        <pathelement location="../../mvnrepo/org/hibernate/hibernate-entitymanager/4.3.1.Final/hibernate-entitymanager-4.3.1.Final.jar"/>  
        <pathelement location="../../mvnrepo/org/jboss/logging/jboss-logging/3.1.3.GA/jboss-logging-3.1.3.GA.jar"/>  
        <pathelement location="../../mvnrepo/org/jboss/logging/jboss-logging-annotations/1.2.0.Beta1/jboss-logging-annotations-1.2.0.Beta1.jar"/>  
        <pathelement location="../../mvnrepo/org/hibernate/hibernate-core/4.3.1.Final/hibernate-core-4.3.1.Final.jar"/>  
        <pathelement location="../../mvnrepo/antlr/antlr/2.7.7/antlr-2.7.7.jar"/>  
        <pathelement location="../../mvnrepo/org/jboss/jandex/1.1.0.Final/jandex-1.1.0.Final.jar"/>  
        <pathelement location="../../mvnrepo/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar"/>  
        <pathelement location="../../mvnrepo/xml-apis/xml-apis/1.0.b2/xml-apis-1.0.b2.jar"/>  
        <pathelement location="../../mvnrepo/org/hibernate/common/hibernate-commons-annotations/4.0.4.Final/hibernate-commons-annotations-4.0.4.Final.jar"/>  
        <pathelement location="../../mvnrepo/org/hibernate/javax/persistence/hibernate-jpa-2.1-api/1.0.0.Final/hibernate-jpa-2.1-api-1.0.0.Final.jar"/>  
        <pathelement location="../../mvnrepo/org/jboss/spec/javax/transaction/jboss-transaction-api_1.2_spec/1.0.0.Final/jboss-transaction-api_1.2_spec-1.0.0.Final.jar"/>  
        <pathelement location="../../mvnrepo/org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.jar"/>  
        <pathelement location="../../mvnrepo/c3p0/c3p0/0.9.1.2/c3p0-0.9.1.2.jar"/>  
        <pathelement location="../../mvnrepo/mysql/mysql-connector-java/5.1.26/mysql-connector-java-5.1.26.jar"/>  
        <pathelement location="../../mvnrepo/com/fasterxml/jackson/core/jackson-databind/2.3.1/jackson-databind-2.3.1.jar"/>  
        <pathelement location="../../mvnrepo/com/fasterxml/jackson/core/jackson-annotations/2.3.0/jackson-annotations-2.3.0.jar"/>  
        <pathelement location="../../mvnrepo/com/fasterxml/jackson/core/jackson-core/2.3.1/jackson-core-2.3.1.jar"/>  
        <pathelement location="../../mvnrepo/javax/servlet/javax.servlet-api/3.1.0/javax.servlet-api-3.1.0.jar"/>  
        <pathelement location="../../mvnrepo/javax/servlet/jsp/jsp-api/2.2.1-b03/jsp-api-2.2.1-b03.jar"/>  
        <pathelement location="../../mvnrepo/javax/servlet/jsp/jstl/javax.servlet.jsp.jstl-api/1.2.1/javax.servlet.jsp.jstl-api-1.2.1.jar"/>  
        <pathelement location="../../mvnrepo/org/apache/taglibs/taglibs-standard-impl/1.2.1/taglibs-standard-impl-1.2.1.jar"/>  
        <pathelement location="../../mvnrepo/commons-fileupload/commons-fileupload/1.3.1/commons-fileupload-1.3.1.jar"/>  
        <pathelement location="../../mvnrepo/commons-io/commons-io/2.2/commons-io-2.2.jar"/>  
        <pathelement location="../../mvnrepo/org/springframework/spring-test/3.2.8.RELEASE/spring-test-3.2.8.RELEASE.jar"/>  
        <pathelement location="../../mvnrepo/junit/junit/4.11/junit-4.11.jar"/>  
        <pathelement location="../../mvnrepo/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"/>  
    </path>  
    <path id="test.classpath">  
        <pathelement location="target/classes"/>  
        <path refid="Maven Dependencies.libraryclasspath"/>  
    </path>  
    <target name="clean">  
        <echo message="删除target目录"/>  
        <delete dir="target"/>  
    </target>  
    <target depends="clean" name="init">  
        <echo message="创建target/classes编译目录"/>  
        <mkdir dir="target/classes"/>  
    </target>  
    <target depends="init" name="build">  
        <echo message="拷贝src/main/resources文件到编译目录target/classes"/>  
        <copy includeemptydirs="false" todir="target/classes">  
            <fileset dir="src/main/resources">  
                <exclude name="**/*.java"/>  
                <include name="**"/>  
            </fileset>  
        </copy>  
        <echo message="编译src/main/java到编译目录target/classes"/>  
        <javac debug="true" debuglevel="source,lines,vars" fork="true" executable="${javac.exe}" encoding="UTF-8" destdir="target/classes" includeantruntime="false" source="${source}" target="${target}">  
            <src path="src/main/java"/>  
            <classpath refid="test.classpath"/>  
        </javac>  
    </target>  
    <target depends="build" name="jar" description="TO JAR THE PROJECT">  
        <echo message="打包编译目录target/classes"/>  
        <jar destfile="target/${ant.project.name}.jar" basedir="target/classes" />  
    </target>  
</project> 

转载自: http://blog.csdn.net/xiejx618/article/details/37918821

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值