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.lang.ClassFormatError 类格式错误。当Java虚拟机试图从一个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时抛出。 java.lang.Error 错误。是所有错误的基类,用于标识严重的程序运行问题。这些...
第一次运行JB2006开如J2ME时出现 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/...
android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台
android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台
2015年中国移动电子竞技游戏发展趋势报告(1).zip
ckplayer是一款在网页上播放视频的免费的播放器,功能强大,体积小巧,跨平台,使用起来随心所欲。 CKplayer播放器主要以adobe的flash(所使用的版本是CS5)平台开发,所以在支持flash插件的平台和浏览器上都可以使用,而无需下载其它插件,如果你需要修改完整版里提供的相关的flash源文件,请使用adobe的flash cs5以上版本打开源文件修改。 ckplayer同时也支持
46.书籍学习平台的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)论坛,公告,付费专区,免费专区,销售,会员办理,书籍分类 详细设计文档链接:http://t.csdnimg.cn/GSeDN 内容概要: 全套项目源码+详尽文档,一站式解决您的学习与项目需求。 适用人群: 计算机、通信、人工智能、自动化等专业的学生、老师及从业者。 使用场景及目标: 无论是毕设、期末大作业还是课程设计,一键下载,轻松部署,助您轻松完成项目。 项目代码经过调试测试,确保直接运行,节省您的时间和精力。 其他说明: 项目整体具有较高的学习借鉴价值,基础能力强的可以在此基础上修改调整,以实现不同的功能。
密码学实验报告2.docx
android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台
S7200基本编程指令.ppt
【资源说明】 基于python+OpenCV的火车票识别源码+使用文档+全部资料(优秀项目).zip基于python+OpenCV的火车票识别源码+使用文档+全部资料(优秀项目).zip 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台
移动机器人机械臂的设计小论文.doc
【资源说明】 基于Python+OpenCV+tinker的指纹识别系统,使用的硬件为AS608源码+使用文档+全部资料(优秀项目).zip基于Python+OpenCV+tinker的指纹识别系统,使用的硬件为AS608源码+使用文档+全部资料(优秀项目).zip 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
xiuno模板知乎蓝魔改版源码附多个插件
2022年 【24页】从孪生到融生,AIGC成为长期方向.zip
[信息与通信]使用EMIF将Xilinx_FPGA与TI_DSP平台接口.pdf
【资源说明】 基于Opencv+Filterpy实现YOLOV3-SORT车辆跟踪与车流统计算法源码+使用文档+全部资料(优秀项目).zip基于Opencv+Filterpy实现YOLOV3-SORT车辆跟踪与车流统计算法源码+使用文档+全部资料(优秀项目).zip基于Opencv+Filterpy实现YOLOV3-SORT车辆跟踪与车流统计算法源码+使用文档+全部资料(优秀项目).zip 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台