配合这篇文章看http://www.iteye.com/topic/753834
- 自定义的ClassLoader有自己的上下文,你可以指定从什么地方得到这个文件或者流,本例是C:/classes/
- 调用自定义的ClassLoader的loadClass方法能根据package+className得到这个Class对象
(怎么从流转化为Class这个不需要我们操心,直接调用父类ClassLoader的defineClass方法)
package depeng.classload;
import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;
/**
* Created by IntelliJ IDEA.
* User: depeng
* Date: 2010-9-3
* Time: 15:48:02
* To change this template use File | Settings | File Templates.
*/
public class MyClassLoader extends ClassLoader {
private String fileName;
public MyClassLoader(String fileName) {
this.fileName = fileName;
}
protected Class findClass(String className) throws ClassNotFoundException {
Class clazz = this.findLoadedClass(className);
if (null == clazz) {
try {
String classFile = getClassFile(className);
FileInputStream fis = null;
try {
fis = new FileInputStream(classFile);
} catch (FileNotFoundException e) {
System.out.println(e);
e.printStackTrace();
}
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();
byte[] bytes = baos.toByteArray();
// Converts an array of bytes into an instance of class Class
clazz = defineClass(className, bytes, 0, bytes.length);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return clazz;
}
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(fileName);
name = name.replace('.', File.separatorChar) + ".class";
sb.append(File.separator + name);
return sb.toString();
}
}
package depeng.classload;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
/**
* Created by IntelliJ IDEA.
* User: depeng
* Date: 2010-9-3
* Time: 13:56:40
* To change this template use File | Settings | File Templates.
*/
public class Worker {
public static void testInFileSystem() throws Exception {
// URL[] urls = new URL[]{new URL("file:/C:/java/")};
// URLClassLoader loader = new URLClassLoader(urls);
// Class clas = loader.loadClass("depeng.classload.URLClassLoaderTest");
// Method m = clas.getMethods()[0];
// Object o = clas.newInstance();
// m.invoke(o,null);
//
// System.out.println(loader.getClass());
// System.out.println(loader.getParent().getClass());
// System.out.println(loader.getParent().getParent().getClass());
// System.out.println(loader.getParent().getParent().getParent());
// System.out.println("cccc " +Worker.class.getClassLoader().getClass());
MyClassLoader mc = new MyClassLoader("C:/classes/");
Class aClass = mc.loadClass("depeng.classload.URLClassLoaderTest");
Method ma = aClass.getMethods()[0];
Object oa = aClass.newInstance();
ma.invoke(oa, null);
System.out.println(mc.getClass());
System.out.println(mc.getParent().getClass());
System.out.println(mc.getParent().getParent().getClass());
System.out.println(mc.getParent().getParent().getParent());
}
public static void main(String[] args) throws Exception {
testInFileSystem();
}
}
分享到:
相关推荐
在这个"web_classloader_test.zip_web classloader"示例中,我们可能涉及到了一些关于Web应用中类加载机制的核心概念。下面将详细探讨这些知识点。 1. **双亲委派模型**:这是Java类加载器的基础模型,它规定了类...
1. `this.getClass().getResource("")`:获取当前类所在的目录路径,如`file:/D/workspace/jbpmtest3/bin/com/test/`。 2. `this.getClass().getResource("/")`:获取当前类路径的根路径,如`file:/D/workspace/...
package test.classloader; import java.io.*; import org.apache.log4j.Logger; public class MyClassLoader extends ClassLoader { private String baseDir; private static final Logger logger = Logger....
4. **Java代码**:在Java代码中使用`ClassLoader`的`setClassPath()`方法,但这通常不推荐,因为它可能影响其他库的加载。 在进行测试时,你需要创建自己的测试类,继承自`Test`或使用`TestDriver`,编写测试方法,...
在"Test"这个Demo程序中,可能包含了几种测试用例,用于演示不同ClassLoader如何加载类,以及它们之间的协作关系。例如,可能会创建自定义的ClassLoader子类,然后尝试加载一个类,观察加载顺序和结果。这些测试用例...
本classloader可以从ftp或本地系统中动态的加载jar,zip资源,当资源实时变动时classlader会自动重新加载,不需要应用重新启动。样例: 加载ftp上某个目录下的所有jar,zip资源。 SingleClassLoader loader = new ...
包装tank.test; 导入java.util.Scanner; 导入tank.classloader.ClassLoaderManager; 导入tank.classloader.MyClassLoaderManager; 导入tank.classloader.SystemClassLoaderManager; / ** @作者坦克 @date:2015...
Class<?> testClass = classLoader.loadClass("com.example.Test"); // 可以进一步实例化这个类,调用其方法等 Object instance = testClass.newInstance(); Method method = testClass.getMethod("run"); ...
重新载入Java 支持类重载的ClassLoader的简单实现运行示例构建项目开始示例 gradle buildjava -cp build/classes/test/:build/libs/reload-java-1.0.jar reload.ReloadExample1该应用程序将等待输入,输入r + 已加载...
一个 JUnit 测试运行器,它在单独的ClassLoader中加载测试类和可选的指定类。 这意味着静态成员将在每个测试类之间有效地重置,因为这些类的新版本被加载。 Maven 依赖 < groupId>com.binarytweed</ groupId> ...
"引导程序Test.zip"可能是一个包含特定引导加载程序的压缩文件,用于测试或教学目的。在这个场景中,我们主要关注的是与Java相关的引导程序知识,因为标签为"java"。 Java引导程序(Bootstrap ClassLoader)是Java...
在 Java 中,有两种方式可以获取文件路径,即使用 Class.getResourceAsStream() 和 ClassLoader.getResourceAsStream()。 Class.getResourceAsStream() Class.getResourceAsStream() 方法返回的是一个 InputStream...
DexClassLoader cl = new DexClassLoader(jarFile.toString(), "/sdcard/test", null, ClassLoader.getSystemClassLoader()); Class<?> c = cl.loadClass("com.qihoo360.test.Test"); ... } ``` 2. **...
但运行时抛出了`SecurityException`,原因在于`Test`类是由不同的ClassLoader加载的,而不是启动类加载器,因此无法访问由启动类加载器加载的`java.lang.String`类的私有构造函数。 在Java中,只有由同一个...
Java默认提供了一些ClassLoader,如`Bootstrap ClassLoader`、`Extension ClassLoader`和`Application ClassLoader`。开发者也可以通过继承`ClassLoader`类来自定义自己的类加载器,实现特定的需求。 #### 三、示例...
VirtualFile testFile = home.getChild("test.txt"); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); Resource[] resources = resolver.getResources("/home/test.txt"); ...
@Test public void testClassLoader1() throws ClassNotFoundException, IOException { // 1. 获取系统的类加载器 ClassLoader classLoader = ClassLoader.getSystemClassLoader(); System.out.println("系统的类...
一种策略是创建与原类具有相同名称但带有版本信息的新类,例如 Test_v1.class 和 Test_v2.class。当类变更时,使用新的版本号加载更新的类。然而,JVM 不允许同一 ClassLoader 加载同名的不同类,因此需要借助 ASM...