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文件详解 #### 一、Java与JVM中的Class文件加载机制概述 Java作为一种动态性极强的解释型编程语言,在程序运行时,Java虚拟机(JVM)负责将编译生成的`.class`文件加载到内存中进行执行。在Java...
用户只需打开软件并加载class文件,程序会自动进行反编译工作,将.class文件的内容解析为可读的Java源代码显示出来。这样的界面友好型设计使得非专业开发者也能相对容易地操作。 在标签"反编译"中,我们理解到这个...
4. 解析:JVM解析类中的符号引用,将其转换为直接引用。这涉及类、接口、字段和方法的引用。 5. 初始化:最后,JVM执行类的初始化方法(),对静态变量进行显式初始化。 用Java解析class文件,意味着我们可以编写...
Java Class文件是Java程序经过编译后的二进制表示形式,它是Java虚拟机(JVM)执行的基础。本文将深入探讨Java类文件的结构、编译过程以及如何使用提供的工具进行查看。 一、Java类文件结构 Java源代码(.java文件...
在Java开发中,.class文件是Java源代码经过编译后的二进制格式,它包含了程序的字节码。当我们需要查看或理解这些已编译的类文件内部结构时,就需要进行反编译。XJad是早期的一种Java反编译工具,用于将.class文件...
标题"jad 编译.class文件成java源文件"所指的,就是使用JAD工具将`.class`文件反编译为`.java`源代码的过程。`.class`文件是Java虚拟机(JVM)运行的二进制格式,而`.java`文件是程序员编写的源代码格式。通过反编译...
3. **学习Java字节码**:对于学习和研究Java虚拟机(JVM)的人来说,反编译Class文件是深入理解字节码与源代码之间关系的有效方式。 使用MyEclipse反编译Class文件工具时,一般步骤如下: 1. **导入Class文件**:将...
在开发过程中,源代码会被编译成字节码(.class文件),这是Java虚拟机(JVM)能够理解和执行的格式。然而,由于字节码是二进制形式,直接查看会非常困难,因此我们需要使用特定的工具来反编译这些.class文件,以...
这篇博客“Java类动态加载(一)——java源文件动态编译为class文件”可能主要探讨了如何在运行时将Java源代码(.java)编译成对应的字节码文件(.class),并将其加载到Java虚拟机(JVM)中。以下是对这个主题的详细解析...
标题所提及的“class文件编译利器”就是一款专为此目的设计的工具。这款工具简化了反编译过程,只需两步操作,即可轻松完成对`.class`文件的解析。 首先,我们需要了解什么是`.class`文件。在Java程序中,源代码(`...
- JVM加载CLASS文件后,会通过类加载器进行验证、准备、解析和初始化等步骤,确保字节码的安全性和正确性。 - 执行时,JVM使用解释器将字节码转换为机器码,或者使用即时编译器(JIT)将频繁执行的代码编译为本地...
Java的Class文件是Java字节码的载体,它包含了程序的机器无关的指令,由Java虚拟机(JVM)执行。然而,由于Class文件是以二进制格式存储的,对于人类阅读来说并不友好。这就引入了"反编译"的概念,即将Class文件转换...
在Java编程语言中,.class文件是Java源代码(.java文件)经过编译后的二进制形式,它包含了程序的机器码,可供Java虚拟机(JVM)执行。有时,我们可能需要将已编译的.class文件反编译回原始的.java源代码文件,以便...
"DJJava 反编译class文件"是一款专门用于此目的的工具,它能够将Java字节码转换回可读的Java源代码。这个工具对于开发者来说尤其有用,当他们需要理解第三方库的工作原理,或者恢复丢失的源代码时。 首先,我们需要...
提供的jvm.docx文件可能包含更详细的案例分析,比如如何解析特定的class文件,如何理解字节码指令,以及这些指令如何与JVM的运行机制相结合。 5. **理解与实践**: 学习class文件解析不仅可以加深对Java虚拟机的...
总的来说,Python解析和执行Java Class文件是一项涉及编译原理、字节码和虚拟机模拟的复杂任务。它需要对Java字节码格式有深入的理解,同时也需要熟悉Python的字节操作和数据结构。通过实践这样的项目,开发者可以...