`
jie_bosshr
  • 浏览: 142007 次
  • 性别: 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);
		}
	}
}
分享到:
评论

相关推荐

    jvm 加载class文件

    ### JVM加载Class文件详解 #### 一、Java与JVM中的Class文件加载机制概述 Java作为一种动态性极强的解释型编程语言,在程序运行时,Java虚拟机(JVM)负责将编译生成的`.class`文件加载到内存中进行执行。在Java...

    反编译软件,可以将class文件反编译为java文件

    用户只需打开软件并加载class文件,程序会自动进行反编译工作,将.class文件的内容解析为可读的Java源代码显示出来。这样的界面友好型设计使得非专业开发者也能相对容易地操作。 在标签"反编译"中,我们理解到这个...

    JVM之用Java解析class文件共10页.pdf.zi

    4. 解析:JVM解析类中的符号引用,将其转换为直接引用。这涉及类、接口、字段和方法的引用。 5. 初始化:最后,JVM执行类的初始化方法(),对静态变量进行显式初始化。 用Java解析class文件,意味着我们可以编写...

    java class文件编译

    Java Class文件是Java程序经过编译后的二进制表示形式,它是Java虚拟机(JVM)执行的基础。本文将深入探讨Java类文件的结构、编译过程以及如何使用提供的工具进行查看。 一、Java类文件结构 Java源代码(.java文件...

    jar 反编译.class文件 XJad

    在Java开发中,.class文件是Java源代码经过编译后的二进制格式,它包含了程序的字节码。当我们需要查看或理解这些已编译的类文件内部结构时,就需要进行反编译。XJad是早期的一种Java反编译工具,用于将.class文件...

    jad 编译.class文件成java源文件

    标题"jad 编译.class文件成java源文件"所指的,就是使用JAD工具将`.class`文件反编译为`.java`源代码的过程。`.class`文件是Java虚拟机(JVM)运行的二进制格式,而`.java`文件是程序员编写的源代码格式。通过反编译...

    MyEclipse反编译Class文件工具

    3. **学习Java字节码**:对于学习和研究Java虚拟机(JVM)的人来说,反编译Class文件是深入理解字节码与源代码之间关系的有效方式。 使用MyEclipse反编译Class文件工具时,一般步骤如下: 1. **导入Class文件**:将...

    查看java编译后的class文件的反编译工具.rar

    在开发过程中,源代码会被编译成字节码(.class文件),这是Java虚拟机(JVM)能够理解和执行的格式。然而,由于字节码是二进制形式,直接查看会非常困难,因此我们需要使用特定的工具来反编译这些.class文件,以...

    Java类动态加载(一)——java源文件动态编译为class文件

    这篇博客“Java类动态加载(一)——java源文件动态编译为class文件”可能主要探讨了如何在运行时将Java源代码(.java)编译成对应的字节码文件(.class),并将其加载到Java虚拟机(JVM)中。以下是对这个主题的详细解析...

    class文件编译利器

    标题所提及的“class文件编译利器”就是一款专为此目的设计的工具。这款工具简化了反编译过程,只需两步操作,即可轻松完成对`.class`文件的解析。 首先,我们需要了解什么是`.class`文件。在Java程序中,源代码(`...

    编译好的CLASS文件

    - JVM加载CLASS文件后,会通过类加载器进行验证、准备、解析和初始化等步骤,确保字节码的安全性和正确性。 - 执行时,JVM使用解释器将字节码转换为机器码,或者使用即时编译器(JIT)将频繁执行的代码编译为本地...

    class文件反编译工具

    Java的Class文件是Java字节码的载体,它包含了程序的机器无关的指令,由Java虚拟机(JVM)执行。然而,由于Class文件是以二进制格式存储的,对于人类阅读来说并不友好。这就引入了"反编译"的概念,即将Class文件转换...

    反编译.class文件问java文件

    在Java编程语言中,.class文件是Java源代码(.java文件)经过编译后的二进制形式,它包含了程序的机器码,可供Java虚拟机(JVM)执行。有时,我们可能需要将已编译的.class文件反编译回原始的.java源代码文件,以便...

    DJJava 反编译class文件

    "DJJava 反编译class文件"是一款专门用于此目的的工具,它能够将Java字节码转换回可读的Java源代码。这个工具对于开发者来说尤其有用,当他们需要理解第三方库的工作原理,或者恢复丢失的源代码时。 首先,我们需要...

    class文件解析案例

    提供的jvm.docx文件可能包含更详细的案例分析,比如如何解析特定的class文件,如何理解字节码指令,以及这些指令如何与JVM的运行机制相结合。 5. **理解与实践**: 学习class文件解析不仅可以加深对Java虚拟机的...

    python实现的简单的class解析以及简单执行class.zip

    总的来说,Python解析和执行Java Class文件是一项涉及编译原理、字节码和虚拟机模拟的复杂任务。它需要对Java字节码格式有深入的理解,同时也需要熟悉Python的字节操作和数据结构。通过实践这样的项目,开发者可以...

Global site tag (gtag.js) - Google Analytics