不兼容的魔法值错误

Posted

技术标签:

【中文标题】不兼容的魔法值错误【英文标题】:Incompatible magic value error 【发布时间】:2011-09-13 18:04:05 【问题描述】:

我正在关注以下链接中的示例:

http://www.javaworld.com/javaworld/jw-10-1996/jw-10-indepth.html?page=1 这是我得到的输出:

该程序将使用 SimpleClassLoader。 >>>>>> 加载类:TestClass >>>>>> 不是系统类。 >>>>>> 获取 TestClass 的实现 文件被成功读取 线程“主”java.lang.ClassFormatError 中的异常:类文件中不兼容的魔法值 1768779887 在 java.lang.ClassLoader.defineClass1(本机方法) 在 java.lang.ClassLoader.defineClassCond(未知来源) 在 java.lang.ClassLoader.defineClass(未知来源) 在 java.lang.ClassLoader.defineClass(未知来源) 在 aha.SimpleClassLoader.loadClass(SimpleClassLoader.java:80) 在 aha.SimpleClassLoader.loadClass(SimpleClassLoader.java:42) 在 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 目录下。 我的课程位于包下:啊哈 所以文件 TestClass.impl 被读取了,但是在这个过程中发生了一些事情 结果 = defineClass(classData, 0, classData.length); 我知道这种方法已被弃用但仍然存在??

【问题讨论】:

该文件不是一个有效的类。您的 TestClass.impl 中有什么?它应该是一个 .class 文件。此外,将文件读取到 .availiable() 不会读取整个文件。 @J-16 SDiZ .available() 对于小于 2GB 的文件恰好可以以这种方式工作,但不能保证可以正常工作。它不适用于任何其他流类型。 【参考方案1】:

我不知道.impl 是什么文件类型,但我怀疑它不是包含字节码的类文件。十六进制的幻数 1768779887 是 ASCII 中的 696D706Fimpo。 (我怀疑import的前四个字节)

所以在我看来,您正在尝试加载无法执行的未编译 Java 代码(这就是编译器的用途)您最好使用 Compiler API,但我怀疑您确实需要像 OSGi 这样的东西尝试自己加载类需要您非常详细地了解类加载的工作原理。

【讨论】:

+1 用于发现问题并推荐 OSGi 作为明智的解决方案。【参考方案2】:

我在一个常规的 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

【讨论】:

以上是关于不兼容的魔法值错误的主要内容,如果未能解决你的问题,请参考以下文章

java - 错误不兼容类型:意外返回值 - 遍历列表

训练模型时出现不兼容行维度的值错误

为啥会出现错误:类与键名的键值编码不兼容?

AAPT:错误:“TODO”与导出的属性 (attr) 布尔值不兼容 [重复]

此类与键错误的键值编码不兼容

如何修复错误:此类与键 tableView 的键值编码不兼容。 [复制]