实现我自己的类加载器

时间:2015-05-17 14:32:19

标签: classloader

我试图实现我自己的类加载器,它必须是应用程序的透明度,并且仍然会出现NoClassDefError错误。 这是我的自定义类加载器:

Python Project

这是我的主要代码:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;


public class CustomClassLoader extends ClassLoader{

    public CustomClassLoader(ClassLoader parent) {
        super(parent);
    }

    public Class loadClass(String name) throws ClassNotFoundException {
    System.out.print(name);
        if(!"MyObject".equals(name)){
            System.out.println("Super load class function");
                return super.loadClass(name);

        }
        try {
            System.out.println("Go to load class function");
            String url = "file:C:/Users/ahmad/Desktop/CustomClassLoader/class/MyObject.class";
            URL myUrl = new URL(url);
            URLConnection connection = myUrl.openConnection();
            InputStream input = connection.getInputStream();
            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
            int data = input.read();
            while(data != -1){
                buffer.write(data);
                data = input.read();
            }
            input.close();
            byte[] classData = buffer.toByteArray();
            return defineClass(name, classData, 0, classData.length);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}

with -Djava.system.class.loader =" CustomClassLoader" VM的参数。

是否遗漏了任何东西。 非常感谢。

2 个答案:

答案 0 :(得分:0)

您不应该使用该系统属性。尝试按照建议here

使用loadClass方法和反射Object main = loader.loadClass("Main", true).newInstance();

答案 1 :(得分:0)

应该传递给构造函数的ClassLoader实例究竟是什么?

无论如何你的实现都是错误的,因为你没有先委托父母(这就是它在Java SE中的工作方式)。