`
qq4628241
  • 浏览: 61305 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

自定义类加载器 java.lang.ClassFormatError

 
阅读更多
package com.scott.classloader;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class MyClassLoader extends ClassLoader{
private String name;
private String path;
private final String fileType=".class";
public MyClassLoader(String name){
super();
this.name = name;
}

public MyClassLoader(String name, String path, ClassLoader parent){
super(parent);
this.name = name;
this.path = path;
}

@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
String filePath = name.replace(".", "\\");
         filePath = path+filePath+fileType;
         System.out.println("file path is : "+filePath);
byte[] b = loadClassData(filePath);
         return defineClass(name, b, 0, b.length);
}

private byte[] loadClassData(String fileName) {
         byte[] result = null;
        
         ByteArrayOutputStream baos = null;
         //FileInputStream fis = null;
         InputStream inputStream = null;
         try{
//        //错误的实现方式导致了class文件和byte数组不一致,JVM检查不过
//        baos = new ByteArrayOutputStream();
//        inputStream = new FileInputStream(new File(fileName));
//        //特别注意 !!!!!!!!!!!!!!!!!!!!!!!!!
//        byte[] byteBuffer = new byte[1];//需要一个一个字节的读取,当是1024时,报错Exception in thread "main" java.lang.ClassFormatError: Extra bytes at the end of class file Parent
//        while(-1 != inputStream.read(byteBuffer)){
//        baos.write(byteBuffer);
//        }
//        result = baos.toByteArray();
        baos = new ByteArrayOutputStream();
        inputStream = new FileInputStream(new File(fileName));
        int length = 0;
        //特别注意 !!!!!!!!!!!!!!!!!!!!!!!!!
        byte[] byteBuffer = new byte[1024];//
        while(-1 != (length=inputStream.read(byteBuffer))){
        baos.write(byteBuffer,0,length);
        }
        result = baos.toByteArray();
         }catch(Exception e){
        e.printStackTrace();
         }finally{
        if(null!=baos){
        try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
        }
       
        if(null!=inputStream){
        try {
        inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
        }
         }
        
         return result;
     }

@Override
public String toString() {
return this.name;
}

public static void main(String[] args) throws Exception {
System.out.println("Hello MyClassLoader!");
//MyClassLoader loaderOne = new MyClassLoader("loader111", "e:/myapp/",ClassLoader.getSystemClassLoader());
MyClassLoader loaderOne = new MyClassLoader("loader111", "e:\\myapp\\",null);
System.out.println("start loade class");
Class<?> loadClass = loaderOne.loadClass("Parent");
System.out.println("the class is : "+loadClass);
Object newInstance = loadClass.newInstance();
}
}

//java.lang.ClassFormatError: Extra bytes at the end of class file
这个报错在网上查资料,说是JDK运行版本与编译版本不符合
我机器的情况是这样的:
C:\Users\Administrator>java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b18)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

C:\Users\Administrator>javac -version
javac 1.8.0
网上说报错的其中一种情况是编译版本低于运行版本
但是我在eclipse中通过系统类加载器加载类对象的方式没有任何问题,但是通过自定义类加载器加载就报错了,我也查看了eclipse的编译环境和运行环境JDK版本都是一致的。
所以我判定是读取class文件有问题,经过文件复制的查看,发现确实在读取文件的时候,需要一个字节一个字节的读取,这样才能保证*.class文件与原文件保持内容一致。才能符合jdk对java文件的文件结构检查,语意检查,操作码与操作数检查,二进制兼容性检查等。我想这里应该是二进制兼容性检查出问题了。
分享到:
评论

相关推荐

    java 异常总结

    java.lang.ClassFormatError 类格式错误。当Java虚拟机试图从一个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时抛出。 java.lang.Error 错误。是所有错误的基类,用于标识严重的程序运行问题。这些...

    jbuilder 2006 j2me ALERT: java/lang/ClassFormatError: Bad version information.

    第一次运行JB2006开如J2ME时出现 ALERT: java/lang/ClassFormatError: Bad version information.错误 点“启动”就会出错 我现在找到了答案 请你们下去看

    ALERT: java/lang/ClassFormatError: Bad version information.

    ALERT: java/lang/ClassFormatError: Bad version information. 大 | 中 | 小 Tags: j2me , jbuilder2006 JBuilder2006使用 JBuilder Wireless Toolkit 2.2 运行J2me程序,发生如下错误: ALERT: java/lang/...

    基于百度地图实现的定位功能.zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

    加载本地图片,绝对不会出现OOM.zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

    2015年中国移动电子竞技游戏发展趋势报告(1).zip

    2015年中国移动电子竞技游戏发展趋势报告(1).zip

    CKplayer-v6.8.zip

    ckplayer是一款在网页上播放视频的免费的播放器,功能强大,体积小巧,跨平台,使用起来随心所欲。 CKplayer播放器主要以adobe的flash(所使用的版本是CS5)平台开发,所以在支持flash插件的平台和浏览器上都可以使用,而无需下载其它插件,如果你需要修改完整版里提供的相关的flash源文件,请使用adobe的flash cs5以上版本打开源文件修改。 ckplayer同时也支持

    46.书籍学习平台的设计与实现-Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)论坛

    46.书籍学习平台的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)论坛,公告,付费专区,免费专区,销售,会员办理,书籍分类 详细设计文档链接:http://t.csdnimg.cn/GSeDN 内容概要: 全套项目源码+详尽文档,一站式解决您的学习与项目需求。 适用人群: 计算机、通信、人工智能、自动化等专业的学生、老师及从业者。 使用场景及目标: 无论是毕设、期末大作业还是课程设计,一键下载,轻松部署,助您轻松完成项目。 项目代码经过调试测试,确保直接运行,节省您的时间和精力。 其他说明: 项目整体具有较高的学习借鉴价值,基础能力强的可以在此基础上修改调整,以实现不同的功能。

    密码学实验报告2.docx

    密码学实验报告2.docx

    各种旋转动画的ImageView(1).zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

    S7200基本编程指令.ppt

    S7200基本编程指令.ppt

    基于python+OpenCV的火车票识别源码+使用文档+全部资料(优秀项目).zip

    【资源说明】 基于python+OpenCV的火车票识别源码+使用文档+全部资料(优秀项目).zip基于python+OpenCV的火车票识别源码+使用文档+全部资料(优秀项目).zip 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    WordPress.zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

    移动机器人机械臂的设计小论文.doc

    移动机器人机械臂的设计小论文.doc

    基于Python+OpenCV+tinker的指纹识别系统,使用的硬件为AS608源码+使用文档+全部资料(优秀项目).zip

    【资源说明】 基于Python+OpenCV+tinker的指纹识别系统,使用的硬件为AS608源码+使用文档+全部资料(优秀项目).zip基于Python+OpenCV+tinker的指纹识别系统,使用的硬件为AS608源码+使用文档+全部资料(优秀项目).zip 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    xiuno模板知乎蓝魔改版源码附多个插件.zip

    xiuno模板知乎蓝魔改版源码附多个插件

    2022年 【24页】从孪生到融生,AIGC成为长期方向.zip

    2022年 【24页】从孪生到融生,AIGC成为长期方向.zip

    [信息与通信]使用EMIF将Xilinx_FPGA与TI_DSP平台接口.pdf

    [信息与通信]使用EMIF将Xilinx_FPGA与TI_DSP平台接口.pdf

    基于Opencv+Filterpy实现YOLOV3-SORT车辆跟踪与车流统计算法源码+使用文档+全部资料(优秀项目).zip

    【资源说明】 基于Opencv+Filterpy实现YOLOV3-SORT车辆跟踪与车流统计算法源码+使用文档+全部资料(优秀项目).zip基于Opencv+Filterpy实现YOLOV3-SORT车辆跟踪与车流统计算法源码+使用文档+全部资料(优秀项目).zip基于Opencv+Filterpy实现YOLOV3-SORT车辆跟踪与车流统计算法源码+使用文档+全部资料(优秀项目).zip 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    仿QQ消息列表(ListView)滑动删除效果源码.zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

Global site tag (gtag.js) - Google Analytics