package test.classloader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;
public class AnotherClassLoader extends ClassLoader {
private String baseDir;
public AnotherClassLoader(ClassLoader parent, String baseDir) {
super(parent);
this.baseDir = baseDir;
}
@SuppressWarnings("unchecked")
protected Class findClass(String name) throws ClassNotFoundException {
byte[] bytes = loadClassBytes(name);
Class theClass = defineClass("test.classloader.Test", bytes, 0, bytes.length);// A
if (theClass == null)
throw new ClassFormatError();
return theClass;
}
private byte[] loadClassBytes(String className)
throws ClassNotFoundException {
try {
String classFile = getClassFile(className);
FileInputStream fis = new FileInputStream(classFile);
FileChannel fileC = fis.getChannel();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableByteChannel outC = Channels.newChannel(baos);
ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
while (true) {
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 fnfe) {
throw new ClassNotFoundException(className);
}
}
private String getClassFile(String name) {
StringBuffer sb = new StringBuffer(baseDir);
name = name.replace('.', File.separatorChar) + ".class";
sb.append(File.separator + name);
return sb.toString();
}
protected URL findResource(String name) {
try {
System.out.println("Resource:"+name);
URL url = super.findResource(name);
if (url != null)
return url;
url = new URL("file:///" + converName(name));
// 简化处理,所有资源从文件系统中获取
return url;
} catch (MalformedURLException mue) {
return null;
}
}
private String converName(String name) {
StringBuffer sb = new StringBuffer(baseDir);
name = name.replace('.', File.separatorChar);
sb.append(File.separator + name);
return sb.toString();
}
}
分享到:
相关推荐
本教程适合具备基本Java编程能力,包括创建、编译和执行简单的命令行Java程序,以及对类文件有基本理解的读者。完成教程后,你将能够: 1. 扩展JVM的功能性:了解如何利用ClassLoader实现特定的加载逻辑,例如动态...
本文将深入探讨一个简单的`ClassLoader`实现,以及与之相关的知识点。 首先,我们来看标题:“一个简单的ClassLoader”。这里的“简单”通常意味着这个自定义`ClassLoader`只实现了基本的功能,如加载特定位置的...
以下是一个简单的测试代码示例,用于展示如何获取当前运行环境中的类加载器以及它们之间的层次关系。 ```java public class LoaderSample1 { public static void main(String[] args) { Class c; ClassLoader cl...
在给定的"类加载器的简单实现"项目中,我们看到一个开源的C++版本的类加载器尝试模拟Java的类加载机制。 虽然这里提到的是C++实现,但为了深入理解类加载器的工作原理,我们可以首先回顾一下Java中的类加载器机制。...
以下是一个简单的自定义ClassLoader示例,它能从指定的jar文件加载类: ```java public class MyClassLoader extends URLClassLoader { public MyClassLoader(String jarPath) throws MalformedURLException { ...
"classloader-playground"项目的核心是一个简单的Java依赖隔离容器类。在实际开发中,我们常常需要隔离不同模块之间的依赖,避免版本冲突或循环依赖等问题。类加载器可以在这方面发挥重要作用,通过定制类加载器,...
在Android系统中,Classloader(类加载器)是至关重要的组件,它负责查找并加载Java类到Dalvik或ART运行时环境。这个测试demo是为了帮助开发者深入理解Android中两种主要的类加载器:DexClassLoader和...
为了更深入地理解ClassLoader的工作机制,我们将构建一个简单的自定义ClassLoader示例,该ClassLoader能够在加载之前自动编译代码。 **1. 自定义ClassLoader的基本步骤** - **继承ClassLoader**:首先,需要创建一...
下面是一个简单的自定义ClassLoader的示例: ```java public class MyClassLoader extends ClassLoader { private String classPath; public MyClassLoader(String classPath) { this.classPath = classPath; ...
在我们的例子"ClassLoader简单例子"中,我们可能关注的是加载阶段,这是由类加载器完成的。 默认情况下,Java提供了三个内置的类加载器:bootstrap classloader、ext classloader和app classloader。Bootstrap ...
接下来我们通过一个简单的自定义类加载器示例来进一步了解类加载器的工作流程。 ```java package test.classloader; import java.io.*; import org.apache.log4j.Logger; public class MyClassLoader extends ...
* 基本的Java编程能力,包括能够创建、编译和执行简单的命令行Java程序。 * 对类文件范式有一定的了解。 #### 三、类加载器结构 类加载器在Java中遵循一个层次化的结构。Java的类加载器体系结构由三个主要类型的类...
热更新通常依赖于类加载器(Classloader)的工作原理来实现,本篇文章将深入探讨如何利用Android的类加载器实现热更新的机制。 首先,我们需要理解什么是类加载器。在Java和Android中,类加载器是负责查找、加载和...
以下是一个简单的自定义类加载器示例,用于动态加载D盘下的A.class文件: ```java package jvm; import java.io.File; import java.io.FileInputStream; import java.lang.reflect.Method; import java.net.URL; ...
这个模型的逻辑非常简单,但却是 Java 语言中的一种创新。 知识点二:ClassLoader类的loadClass方法 ClassLoader类的loadClass方法是实现双亲委派模型的核心方法,该方法的主要逻辑是:首先检查类是否已被加载,...
简单示例 包装tank.test; 导入java.util.Scanner; 导入tank.classloader.ClassLoaderManager; 导入tank.classloader.MyClassLoaderManager; 导入tank.classloader.SystemClassLoaderManager; / ** @作者坦克 @...
新API包括`LocalDate`、`LocalTime`、`LocalDateTime`等类,它们提供了丰富的操作方法,使日期和时间处理变得简单易行。 对于ClassLoader部分,它是Java虚拟机(JVM)的重要组成部分,负责加载类到JVM中。...