我在 Java 项目中遇到了一些非常奇怪的行为。情况javac
似乎是在编译期间从类中删除了一个方法。
该类看起来像这样:
public class MessedUp extends X {
//a bunch of variables here
//a bunch of methods here
public void thisDisappears(String arg){
}
//a bunch more methods here
}
还有另一个类实例化并调用此方法:
public class WontCompile {
public void doSomething(){
MessedUp mu = new MessedUp();
mu.thisDisappears("something");
}
}
第一个类编译得很好,但第二个没有。javac
输出如下内容:
[javac] C:\mypath\WontCompile.java:251: error: cannot find symbol
[javac] mu.thisDisappears("something");
[javac] ^
[javac] symbol: method thisDisappears(String)
[javac] location: variable mu of type MessedUp
我知道代码很好,因为我已经在 Eclipse 中使用它几年了(当我尝试使用ant
Eclipse 生成的文件时,我正在追踪这个问题)。但是,有时 Eclipse 会突出显示对 的调用thisDisappears
,说它不存在,并提供创建它。如果接受这个提议,那么 Eclipse 会抱怨有两个同名的方法。经过一些明显导致重建或其他事情的处理后,错误消失了。
在被驱动了一段时间后,我决定检查 MessedUp.java 的实际类文件。使用Java Decompiler GUI,我发现thisDisappears
类文件中不存在它!
下面是我的蚂蚁文件:
<project basedir="." default="build" name="MyProject">
<property name="LIB_HOME" value="C:\dev\LibSuite-9.3.1"/>
<property environment="env"/>
<property name="debuglevel" value="source,lines,vars"/>
<property name="target" value="1.7"/>
<property name="source" value="1.7"/>
<path id="MyProject.classpath">
<pathelement location="bin"/>
<pathelement location="lib/edu.mit.jwi_2.1.4.jar"/>
<pathelement location="lib/edu.sussex.nlp.jws.beta.11.jar"/>
<pathelement location="lib/jaws-bin.jar"/>
<pathelement location="lib/junit-4.11.jar"/>
<!--External Jars-->
<pathelement location="${LIB_HOME}/share/java/abc.jar"/>
<pathelement location="${LIB_HOME}/share/java/def-9.3.1.jar"/>
</path>
<target name="init">
<mkdir dir="bin"/>
<copy includeemptydirs="false" todir="bin">
<fileset dir="main/src">
<exclude name="**/*.launch"/>
<exclude name="**/*.java"/>
</fileset>
</copy>
<copy includeemptydirs="false" todir="bin">
<fileset dir="main/test">
<exclude name="**/*.launch"/>
<exclude name="**/*.java"/>
</fileset>
</copy>
</target>
<target name="clean">
<delete dir="bin"/>
</target>
<target depends="init" name="build">
<echo message="${ant.project.name}: ${ant.file}"/>
<javac debug="true" debuglevel="${debuglevel}" destdir="bin" includeantruntime="false" source="${source}" target="${target}">
<classpath refid="MyProject.classpath"/>
<src path="main/src"/>
<src path="main/test"/>
<compilerarg value="-Xlint"/>
</javac>
</target>
<!--Test the app-->
<target depends="build" name="regression">
<junit>
<classpath refid="MyProject.classpath"/>
<test name="uni.my.app.TestSuite"/>
</junit>
</target>
<!--Run the app-->
<target depends="build" name="run">
<java classname="uni.my.app.Application">
<classpath refid="MyProject.classpath"/>
<arg value="sentences.txt"/>
</java>
</target>
</project>
不幸的是,我无法整理出一个最小的破坏示例。我正在编写的代码还没有向公众发布,所以我还不能全部分享。它引用了几个 jars(没有冲突的命名空间),其中一些带有本地方法。我不知道类和罐子的确切组合会导致错误。我在使用 jdk 1.6.0_25 和 1.7.21 时遇到了同样的问题。
有没有人对如何解决这个问题有任何经验或想法?