2011-06-13 73 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