本帖最后由 Young_suse 于 2011-04-18 16:10:21 编辑

解决方案 »

  1.   

    我在网上找了篇帖子,说Eclipse并没有用Sun JDK的javac实现,而是用了自己实现的javac,这样就可以在编译的时候向class文件中写入参数名的信息。
    但是我们项目要求必须用Sun JDK1.5啊,有没有什么办法?
      

  2.   

    从 eclipse网站下载一个ecj-${version}.jar 来编译代码就是了,而且可以在ant中使用。
      

  3.   

    huntor的办法好。
    不过我还是保守,我觉得这里正是用javadoc的地方。
      

  4.   

    谢谢huntor的推荐,回头去研究下ecj-${version}.jar,只是项目组为了避免风险,要求必须用Sun JDK编译,现在这个问题也只能放放了
      

  5.   

     <javac srcdir="${dir.sources}" 
       destdir="${dir.classes}" 
       classpathref="project.classpath" 
           includeantruntime="false"
           source="1.6"
           target="1.6"
           compiler="org.eclipse.jdt.core.JDTCompilerAdapter">
           <compilerclasspath>
               <pathelement path="${dir.library}/ecj-3.6.2.jar"/>
           </compilerclasspath>
      

  6.   


    刚才试了下你的办法,下了ecj-3.6.2.jar,还是只能解决类编译读出实际参数名,而接口编译后,参数仍然是arg0,arg1.后来我了解了javac命令和下字节码的知识。分析如下:Ant的debug和debuglevel参数会去调用JDK的javac -g参数, 而-g参数又包含3个选项, -g:{lines,vars,source},分别代表编译时向字节码中写入行号、方法局部变量信息、关联源代码信息。这里主要说说-g:vars选项,它会向class文件中写入方法的局部变量信息,方法参数也算是局部变量,所以方法的参数名可以被记录。但是对于接口,接口并没有方法体(只有方法声明),所以就不存在局部变量,也就没办法记录方法的参数名。所以,我们用javac -g参数或者用Ant的<javac debug="on"/>编译类可以读出方法参数名,而编译接口就不能读出,仍然是arg0,arg1的形式。要想让接口也能读出方法参数名,唯一的办法就是为class文件关联源代码了。