`

ClassLoader Test

阅读更多

配合这篇文章看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_classloader_test.zip_web classloader"示例中,我们可能涉及到了一些关于Web应用中类加载机制的核心概念。下面将详细探讨这些知识点。 1. **双亲委派模型**:这是Java类加载器的基础模型,它规定了类...

    java classloader classpath 张孝祥

    1. `this.getClass().getResource("")`:获取当前类所在的目录路径,如`file:/D/workspace/jbpmtest3/bin/com/test/`。 2. `this.getClass().getResource("/")`:获取当前类路径的根路径,如`file:/D/workspace/...

    java自定义类加载classloader文档,包括代码

    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....

    编译好的com.bruceeckel.simpletest类文件

    4. **Java代码**:在Java代码中使用`ClassLoader`的`setClassPath()`方法,但这通常不推荐,因为它可能影响其他库的加载。 在进行测试时,你需要创建自己的测试类,继承自`Test`或使用`TestDriver`,编写测试方法,...

    测试普通Java程序ClassLoader等级关系的Demo程序

    在"Test"这个Demo程序中,可能包含了几种测试用例,用于演示不同ClassLoader如何加载类,以及它们之间的协作关系。例如,可能会创建自定义的ClassLoader子类,然后尝试加载一个类,观察加载顺序和结果。这些测试用例...

    Jar classLoader

    本classloader可以从ftp或本地系统中动态的加载jar,zip资源,当资源实时变动时classlader会自动重新加载,不需要应用重新启动。样例: 加载ftp上某个目录下的所有jar,zip资源。 SingleClassLoader loader = new ...

    ClassLoader:ClassLoader动态加载类

    包装tank.test; 导入java.util.Scanner; 导入tank.classloader.ClassLoaderManager; 导入tank.classloader.MyClassLoaderManager; 导入tank.classloader.SystemClassLoaderManager; / ** @作者坦克 @date:2015...

    使用URLClassLoader加载本地文件夹c盘下的test.jar文件

    Class<?> testClass = classLoader.loadClass("com.example.Test"); // 可以进一步实例化这个类,调用其方法等 Object instance = testClass.newInstance(); Method method = testClass.getMethod("run"); ...

    reload-java:在Java 8中尝试使用ClassLoader

    重新载入Java 支持类重载的ClassLoader的简单实现运行示例构建项目开始示例 gradle buildjava -cp build/classes/test/:build/libs/reload-java-1.0.jar reload.ReloadExample1该应用程序将等待输入,输入r + 已加载...

    quarantining-test-runner:JUnit Runner 在单独的 ClassLoader 中加载指定的类,这在依赖于使用静态成员的第三方框架时会很方便

    一个 JUnit 测试运行器,它在单独的ClassLoader中加载测试类和可选的指定类。 这意味着静态成员将在每个测试类之间有效地重置,因为这些类的新版本被加载。 Maven 依赖 < groupId>com.binarytweed</ groupId> ...

    引导程序Test.zip

    "引导程序Test.zip"可能是一个包含特定引导加载程序的压缩文件,用于测试或教学目的。在这个场景中,我们主要关注的是与Java相关的引导程序知识,因为标签为"java"。 Java引导程序(Bootstrap ClassLoader)是Java...

    Java文件路径详解

    在 Java 中,有两种方式可以获取文件路径,即使用 Class.getResourceAsStream() 和 ClassLoader.getResourceAsStream()。 Class.getResourceAsStream() Class.getResourceAsStream() 方法返回的是一个 InputStream...

    Android App 如何动态加载类.doc

    DexClassLoader cl = new DexClassLoader(jarFile.toString(), "/sdcard/test", null, ClassLoader.getSystemClassLoader()); Class<?> c = cl.loadClass("com.qihoo360.test.Test"); ... } ``` 2. **...

    java 类加载器 class loader

    但运行时抛出了`SecurityException`,原因在于`Test`类是由不同的ClassLoader加载的,而不是启动类加载器,因此无法访问由启动类加载器加载的`java.lang.String`类的私有构造函数。 在Java中,只有由同一个...

    JAVA文件中调用已编译的.CLASS的类.doc

    Java默认提供了一些ClassLoader,如`Bootstrap ClassLoader`、`Extension ClassLoader`和`Application ClassLoader`。开发者也可以通过继承`ClassLoader`类来自定义自己的类加载器,实现特定的需求。 #### 三、示例...

    spring源代码

    VirtualFile testFile = home.getChild("test.txt"); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); Resource[] resources = resolver.getResources("/home/test.txt"); ...

    java类加载器

    @Test public void testClassLoader1() throws ClassNotFoundException, IOException { // 1. 获取系统的类加载器 ClassLoader classLoader = ClassLoader.getSystemClassLoader(); System.out.println("系统的类...

    深入探索 Java 热部署

    一种策略是创建与原类具有相同名称但带有版本信息的新类,例如 Test_v1.class 和 Test_v2.class。当类变更时,使用新的版本号加载更新的类。然而,JVM 不允许同一 ClassLoader 加载同名的不同类,因此需要借助 ASM...

Global site tag (gtag.js) - Google Analytics