从字节开始的Java加载类没有正常工作

时间:2016-11-21 17:49:52

标签: java classloader

我试图在运行时从字节数组加载一个类。 它工作正常,自定义类加载器返回一个具有正确名称的有效类对象。我可以使用类对象,我可以通过反射使用该类。

我的问题是,如果我尝试直接使用该类,它仍然会抛出ClassNotFoundException。所以我的问题是,如何加载一个我可以直接使用它的类?

自定义ClassLoader将是关于加载库的,所以我直接引用类

我的代码:

public class ByteClassLoader extends ClassLoader {

    private final HashMap<String, byte[]> classBytes;

    public ByteClassLoader(final ClassLoader loader, HashMap<String, byte[]> classes) {
        super(loader);
        classBytes = classes;
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        final byte[] arr = classBytes.remove(name);

        if (arr != null)
            return defineClass(name, arr, 0, arr.length);

        return super.findClass(name);
    }

    public static void main(String[] args) throws Exception {

        final HashMap<String, byte[]> map = new HashMap<>();

        // Load class file
        final byte[] data = Files.readAllBytes(
            new File("/Users/Florian/Desktop/AC.class").toPath()
        );

        map.put("dyn.AC", data);

        // Create new Custom classloader
        final ByteClassLoader loader = new ByteClassLoader(
            Thread.currentThread().getContextClassLoader(), map
        );

        // Set context class loader
        Thread.currentThread().setContextClassLoader(loader);

        // Loading the class
        Class<?> acc = loader.findClass("dyn.AC");

        // Works. -_-
        acc.getMethod("trigger").invoke(null);

        // Works
        System.out.println(acc.getName());

        // Test method, only contains System.out method, DOESNT WORK
        AC.trigger();
    }
}

AC的内容:http://paste.reflex.rip/umecoruwer.cs

Stacktrace:http://paste.reflex.rip/exezividuz.swift

0 个答案:

没有答案