2011-06-13 72 views
0

我從下面的鏈接下面的例子:不兼容的魔法值誤差

http://www.javaworld.com/javaworld/jw-10-1996/jw-10-indepth.html?page=1 ,這是一個輸出我得到:

 
This program will use SimpleClassLoader. 
     >>>>>> Load class : TestClass 
     >>>>>> Not a system class. 
     >>>>>> Fetching the implementation of TestClass 
file was read successfully 
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 1768779887 in class file 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClassCond(Unknown Source) 
    at java.lang.ClassLoader.defineClass(Unknown Source) 
    at java.lang.ClassLoader.defineClass(Unknown Source) 
    at aha.SimpleClassLoader.loadClass(SimpleClassLoader.java:80) 
    at aha.SimpleClassLoader.loadClass(SimpleClassLoader.java:42) 
    at aha.Example.main(Example.java:11) 

這裏是我的方法的一個例子,讀取一個文件:

private byte getClassImplFromDataBase(String className)[] { 
     System.out.println("  >>>>>> Fetching the implementation of "+className); 
     byte result[]; 
     try { 
      FileInputStream fi = new FileInputStream("C:/delete/"+className+".impl"); 
      result = new byte[fi.available()]; 
      fi.read(result); 
      System.out.println("file was read succesfullyl"); 
      return result; 
     } catch (Exception e) { 

      /* 
      * If we caught an exception, either the class wasnt found or it 
      * was unreadable by our process. 
      */ 
      return null; 
     } 
    } 

我把TestClass.impl文件放在C:/ delete目錄下。 我的類位於包下:aha 因此,文件TestClass.impl被讀取正常,但在 結果= defineClass(classData,0,classData.length); 我知道這個方法已被棄用,但仍然?

+0

該文件不是有效的類。你的TestClass.impl中有什麼?它應該是一個.class文件。另外,讀取.availiable()文件不會讀取整個文件。 – 2011-06-13 08:08:40

+0

@ J-16 SDiZ'.available()'適用於小於2GB的文件,但不能保證可以正常工作。它不適用於任何其他流類型。 – 2011-06-13 08:16:18

回答

5

我不知道.impl是什麼文件類型,但我懷疑它不是包含字節碼的類文件。十六進制中的幻數1768779887是ASCII中的696D706Fimpo。 (我懷疑import的前四個字節)

因此,在我看來,您正在嘗試加載未編譯的Java代碼(這是編譯器的目的)您最好使用Compiler API ,但我懷疑你真的需要像OSGi這樣的東西來加載類,你需要對類加載的工作有非常詳細的理解。

+1

+1用於發現問題並推薦OSGi作爲理智的解決方案。 – 2011-06-13 08:42:34

1

我和一個普通的struts2項目有類似的錯誤,解決了清理項目

8266 ERROR [main]: Excepción arrancando filtro struts2 
java.lang.ClassFormatError: Incompatible magic value 0 in class file com/lm/action/musician/MusicianList 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1650) 
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:856) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1305) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1187) 
    at com.opensymphony.xwork2.util.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:144) 
    at com.opensymphony.xwork2.ObjectFactory.getClassInstance(ObjectFactory.java:108) 
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.verifyAction(XmlConfigurationProvider.java:424) 
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addAction(XmlConfigurationProvider.java:378) 
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:495) 
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadPackages(XmlConfigurationProvider.java:286) 
    at org.apache.struts2.config.StrutsXmlConfigurationProvider.loadPackages(StrutsXmlConfigurationProvider.java:112) 
    at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:234) 
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:66) 
    at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:390) 
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:437) 
    at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:74) 
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:51) 
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:225) 
    at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:308) 
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:79) 
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3563) 
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4133) 
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1012) 
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:718) 
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1012) 
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:442) 
    at org.apache.catalina.core.StandardService.start(StandardService.java:450) 
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:680) 
    at org.apache.catalina.startup.Catalina.start(Catalina.java:536) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:275) 
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) 
8266 ERROR [main]: Excepción arrancando filtro struts2 
java.lang.ClassFormatError: Incompatible magic value 0 in class file com/lm/action/musician/MusicianList 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1650) 
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:856) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1305) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1187) 
    at com.opensymphony.xwork2.util.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:144) 
    at com.opensymphony.xwork2.ObjectFactory.getClassInstance(ObjectFactory.java:108) 
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.verifyAction(XmlConfigurationProvider.java:424) 
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addAction(XmlConfigurationProvider.java:378) 
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:495) 
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadPackages(XmlConfigurationProvider.java:286) 
    at org.apache.struts2.config.StrutsXmlConfigurationProvider.loadPackages(StrutsXmlConfigurationProvider.java:112) 
    at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:234) 
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:66) 
    at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:390) 
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:437) 
    at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:74) 
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:51) 
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:225) 
    at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:308) 
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:79) 
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3563) 
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4133) 
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1012) 
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:718) 
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1012) 
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:442) 
    at org.apache.catalina.core.StandardService.start(StandardService.java:450) 
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:680) 
    at org.apache.catalina.startup.Catalina.start(Catalina.java:536) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:275) 
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) 
abr 19, 2013 10:32:25 AM org.apache.catalina.core.StandardContext start 
SEVERE: Error filterStart 
abr 19, 2013 10:32:25 AM org.apache.catalina.core.StandardContext start