2017-07-28 84 views

回答

5

documentation要鏈接到:

當前AOT限制......

可能無法編譯它使用動態生成的類的字節碼(lambda表達式,調用動態)的Java代碼。

這些限制可能會在將來的版本中解決。

因此,兩個潛在解釋:

  1. 不編譯落入已知限制
  2. 否則的方法,在一個「全新的,實驗性的」產品中的錯誤

最有可能的「選項2」是更好的解釋 - 再次看到你的鏈接。

它包含未能編譯方法列表,與錯誤發生一起:

cat java.base-list.txt 

# jaotc: java.lang.StackOverflowError 
exclude sun.util.resources.LocaleNames.getContents()[[Ljava/lang/Object; 
exclude sun.util.resources.TimeZoneNames.getContents()[[Ljava/lang/Object; 
exclude sun.util.resources.cldr.LocaleNames.getContents()[[Ljava/lang/Object; 
exclude sun.util.resources..*.LocaleNames_.*.getContents\(\)\[\[Ljava/lang/Object; 
exclude sun.util.resources..*.LocaleNames_.*_.*.getContents\(\)\[\[Ljava/lang/Object; 
exclude sun.util.resources..*.TimeZoneNames_.*.getContents\(\)\[\[Ljava/lang/Object; 
exclude sun.util.resources..*.TimeZoneNames_.*_.*.getContents\(\)\[\[Ljava/lang/Object; 
# java.lang.Error: Trampoline must not be defined by the bootstrap classloader 
exclude sun.reflect.misc.Trampoline.<clinit>()V 
exclude sun.reflect.misc.Trampoline.invoke(Ljava/lang/reflect/Method;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; 
# JVM asserts 
exclude com.sun.crypto.provider.AESWrapCipher.engineUnwrap([BLjava/lang/String;I)Ljava/security/Key; 
exclude sun.security.ssl.* 
exclude sun.net.RegisteredDomain.<clinit>()V 
# Huge methods 
exclude jdk.internal.module.SystemModules.descriptors()[Ljava/lang/module/ModuleDescriptor; 

當你檢查源,例如getContents() - 沒有lambda表達式存在。

所以未能編譯方法是最有可能所造成的事實,即新的編譯器是「不尚未準備」成功編譯任意 Java源代碼!

+0

我非常感謝您的幫助。謝謝! – cwei

相關問題