我開始獲取ClassFormatExceptions,我無法解釋與靜態方法有關的接口。我修剪它到這個測試案例:Java 8 ClassFormatException用於靜態方法的接口,但僅當使用斷言時
public interface ModifierTest
{
public static final int DELTA = 10;
public static int increment(int value)
{
assert value > 0; // Problem line
return value + DELTA;
}
}
public class ModifierExec
{
public static void main(String[] args)
{
System.out.println(ModifierTest.class);
}
}
沒有assertion在increment()方法,一切都很好。但隨着斷言,我會在運行時異常(編譯罰款):
Exception in thread "main" java.lang.ClassFormatError: Illegal field modifiers in class ModifierTest: 0x1018
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.c4.camgen.ModifierExec.main(ModifierExec.java:7)
這是很容易一輪工作,但我很好奇,這是否是在Java或糾正錯誤(如果奇怪)的行爲。我無法找到任何影響字段修飾符的斷言的引用。
誰能告訴我發生了什麼事?在Eclipse Kepler中運行,在jdk 1.8.0_20下運行。
這將是有趣的javap該類,看看有什麼。我猜* * assert *會生成一些隱藏的字段信息,這就是扼殺驗證者。 – 2014-09-10 18:11:26
好想法。多年來沒有使用過javap。 Eclipse將「static final boolean $ assertionsDisabled」添加到類中。標準的javac沒有,所以我猜這將通過Maven構建運行良好。 – JonMoore 2014-09-10 19:51:42