`
jie_bosshr
  • 浏览: 140656 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

jvm解析编译过的class文件

    博客分类:
  • JVM
阅读更多
jvm解析编译过的class文件:
说明MyClassLoader类为核心类主要来加载编译后的文件。
Test.class.rar中表示编译的Test.class文件。
TestClass.rar中的TestClass类为最终测试类。
Test.rar中的Test类主要包括一个方法在jvm解析时通过加载Test.class文件最终执行Test类中的方法。
本例中Test.class文件存放在D:\Users\Test.class,文件位置你可以随便存放。
package com.cld;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;

public class MyClassLoader extends ClassLoader {
	public MyClassLoader(ClassLoader parent, String baseDir) {
		super(parent);
	}
	/**
	 * 使用指定的二进制名称查找类
	 * @param name 类的二进制名称 
	 * @return Class 得到的 Class 对象
	 * @throws ClassNotFoundException
	 */
	protected Class findClass(String name) throws ClassNotFoundException {
		// TODO Auto-generated method stub
		byte[] bytes = loadClassBytes(name);
		//将一个 byte 数组转换为 Class 类的实例。必须分析 Class,然后才能使用它。
		Class theClass = defineClass(name, bytes, 0, bytes.length);
		if (theClass == null)
			throw new ClassFormatError();
		return theClass;
	}
	/**
	 * 返回所要加载文件路径
	 * @return String 所要加载文件路径
	 */
	private String getClassFile() {
		return "D:/Users/Test.class";
	}
	/**
	 * 返回所加载的资源文件字节数组
	 * @param className 所需要的类的二进制名称,如果不知道此名称,则该参数为 null
	 * @return 字节数组
	 * @throws ClassNotFoundException
	 */
	private byte[] loadClassBytes(String className)
			throws ClassNotFoundException {
		String classFile = getClassFile();
		try {
			FileInputStream fis = new FileInputStream(classFile);
			//用于读取、写入、映射和操作文件的通道(FileChannel)
			FileChannel filec = fis.getChannel();
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			//可写入字节的通道(WritableByteChannel)
			//Channels.newChannel(baos)构造向给定流写入字节的信道
			WritableByteChannel outC = Channels.newChannel(baos);
			//字节缓冲区ByteBuffer.allocateDirect(1024)分配新的直接字节缓冲区
			ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
			while (true) {
				//filec.read(buffer)将字节序列从此通道读入给定的缓冲区
				int i = filec.read(buffer);
				if (i == 0 || i == -1) {
					break;
				}
				buffer.flip();
				outC.write(buffer);
				buffer.clear();
			}
			fis.close();
			return baos.toByteArray();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			throw new ClassNotFoundException(className);
		}
	}
}
分享到:
评论

相关推荐

    Java虚拟机JVM类加载初始化

    3):从jar、zip等等压缩文件加载类,自动解析jar文件找到class文件去加载util类 4):从java源代码文件动态编译成为class文件 当一个类被加载、连接、初始化后,它的生命周期就开始了,当代表该类的Class对象不再...

    jvm虚拟机规范 pdf 经典

    详细介绍了jvm虚拟机规范,很好 第一章引言 ...第四章 class文件格式 第五章 常熟池解析 第六章 java虚拟机指令集 第七章 为java虚拟机编译 第八章 线程和锁 第九章 优化 第十章 操作码的操作码助记符

    JVM-HotSpot-原理

    • HotSpot • ClassFile • ClassLoader • 内存模型、锁、同步 • JVM内存管理和垃圾收集 Java发展历程 JVM列表 OpenJDK 编译执行过程 解析执行和JIT编译

    【JVM和性能优化】3.JVM的执行子系统

    文章目录Class 文件格式字节码Class类的本质Class文件格式类加载机制加载验证准备解析初始化类加载器双亲委派机制栈桢JVM方法调用详解方法解析静态分派动态分派参考 Class 文件格式 一般情况下Java代码执行流程如下...

    Hpsyche#note#1.Java解释执行编译执行1

    (1)解析:.class文件经过JVM内嵌的解析器解析执行 (2)编译:存在JIT编译器(Just In Time Compile 即时编译器)把经常运行的代码

    java面试题-附答案

    JDK(Java Development Kit)是Java开发工具包,它提供了Java的开发环境(提供了编译器javac等工具,用于将java文件编译为class文件)和运行环境(提供了JVM和Runtime辅助包,用于解析class文件使其得到运行)。...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 112 5.2.5 服务器JVM进程崩溃 / 113 5.3 实战:Eclipse运行速度调优 / 114 5.3.1 调优前的程序运行状态 / 114 5.3.2 升级JDK 1.6的性能变化及兼容问题 / 117 5.3.3 编译时间和类加载时间的优化 / 122 5.3.4 ...

    JVM面试题.pdf

    * 验证:验证这个 class 文件,包括文件格式校验、元数据验证、字节码校验等。 * 准备:对这个对象分配内存。 * 解析:将符号引用转化为直接引用(指针引用)。 * 初始化:开始执行构造器的代码。 十一、JVM 内存...

    轻松搞定jvm类加载器

    通过类的包名和雷鸣查找到此类的字节码文件,将xx.class文件中的二进制数据读入到jvm内存,并存入其中的方法区内,然后利用字节码文件创建一个class对象存入到堆之中,用来封装类的数据结构等。 连接(验证、准备、...

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

    第5-20章深入描述了java技术的内部细节,包括垃圾收集、java安全模型、java的连接模型和动态扩展机制、class文件、运算及流程控制等等,其中等6章和附录a-c完全可以作为class文件和指令含集的参考手册。本书还附带...

    深入分析Java Web技术内幕高清PDF版.zip

    其次深入介绍Java技术,包括I/O技术、中文编码问题、Javac编译原理、class文件结构解析、ClassLoader工作机制及JVM的内存管理等。最后介绍Java服务端技术,主要包括Servlet、Session与Cookie、Tomcat与Jetty服务器、...

    菜鸟进阶练习(01)

    注:力扣选择题练习总结 1、在java中,在同一包内,类Cat里面有个公有方法sleep(),该方法前有static修饰,则可以直接用Cat.sleep()...B:Java文件经过JVM编译成字节码文件,即.class文件,将字节码文件在不同的操作系

    pyjvm:在Nintendo Switch上运行Java字节码(.class文件)!

    它通过解析和解释Java类文件来工作。 依存关系 为了将Java代码编译为Java Bytecode,您将需要具有javac 。 如果您只想运行已编译的字节码,则只需一个Python解释器。 运行测试 该项目带有许多单元测试。 如果运行...

    深入分析Java Web技术内幕 修订版.pdf

    其次深入介绍了Java 技术,包括I/O 技术、中文编码问题、Javac 编译原理、class 文件结构解析、ClassLoader 工作机制及JVM 的内存管理等。最后介绍了Java 服务端技术,主要包括Servlet、Session 与Cookie、Tomcat 与...

    cvte面试题里面包含了许多CVTE面试的真是题目,非常的有用

    在编译过程中,Java 把类编译成一个或多个 .class 字节码文件,然后打包到 jar 中,JVM 会从中 jar 文件中获得相应的 .class 文件和 JRE 字节码。 Android VM 虽然也是用 Java 语言进行编程,Java 程序通过编译后,...

    GraalVM最佳实践,使用Java开发.rar

    到目前为止,GraalVM提供了两种运行Java程序的方法:将Java HotSpot VM与GraalVM JIT(即时)编译器一起使用,以及第二种方法:使用GraalVM ...单遍.class文件解析器 简单对象模型 Java中的Java本机接口(JNI)实现

    Java虚拟机工作原理详解

    Java 代码 -> 编译 -> 字节码 -> 加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 执行 其中,类加载器扮演着非常重要的角色,从文件系统中加载类文件,并将其加载到 JVM 的内存区域中。 五、结论 Java 虚拟机工作...

    Java虚拟机

    6.3.1 魔数与Class文件的版本 6.3.2 常量池 6.3.3 访问标志 6.3.4 类索引、父类索引与接口索引集合 6.3.5 字段表集合 6.3.6 方法表集合 6.3.7 属性表集合 6.4 字节码指令简介 6.4.1 字节码与数据类型 6.4.2...

Global site tag (gtag.js) - Google Analytics