1

我正在尝试将一个类加载到一个字节数组中。MainC、Loader、ClassByte、byteClassLoader都是用来加载类的。

MainC 是起点。

public class MainC
    {
        public static void main(String[] args) {
            Loader loc = new Loader();
            loc.load();
        }
    }

这里我们加载类并调用方法。

public class Loader {
    public void load() {
        for (String classname : ClassByte.getClassNames()) 
        {
            byteClassLoader cl =new byteClassLoader(ClassByte.getBytes(classname));
            Class clz =  cl.findClass(classname);
            if (classname.equals("a.b.Startclass"))
                clz.getDeclaredMethod("startmethod", null).invoke(clz.newInstance(), null);
        }
    }
}

在这里,我们可以获取要加载的类和字节数组。

public class ClassByte 
{
       public static byte[] getBytes(String name)
       {
        if(name.equals(getClassNames()[0]))
            return new byte[] {(byte)0xCA,(byte)0xFE,(byte)0xBA,(byte)0xBE,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x34,(byte)0x00,(byte)0x1F,(byte)0x07,(byte)0x00,(byte)0x02,(byte)0x01,(byte)0x00,(byte)0x11,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x73,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x07,(byte)0x00,(byte)0x04,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x4F,(byte)0x62,(byte)0x6A,(byte)0x65,(byte)0x63,(byte)0x74,(byte)0x01,(byte)0x00,(byte)0x06,(byte)0x3C,(byte)0x69,(byte)0x6E,(byte)0x69,(byte)0x74,(byte)0x3E,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x28,(byte)0x29,(byte)0x56,(byte)0x01,(byte)0x00,(byte)0x04,(byte)0x43,(byte)0x6F,(byte)0x64,(byte)0x65,(byte)0x0A,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x09,(byte)0x0C,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x06,(byte)0x01,(byte)0x00,(byte)0x0F,(byte)0x4C,(byte)0x69,(byte)0x6E,(byte)0x65,(byte)0x4E,(byte)0x75,(byte)0x6D,(byte)0x62,(byte)0x65,(byte)0x72,(byte)0x54,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x12,(byte)0x4C,(byte)0x6F,(byte)0x63,(byte)0x61,(byte)0x6C,(byte)0x56,(byte)0x61,(byte)0x72,(byte)0x69,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x54,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x04,(byte)0x74,(byte)0x68,(byte)0x69,(byte)0x73,(byte)0x01,(byte)0x00,(byte)0x13,(byte)0x4C,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x73,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x3B,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x09,(byte)0x00,(byte)0x10,(byte)0x00,(byte)0x12,(byte)0x07,(byte)0x00,(byte)0x11,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x53,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x0C,(byte)0x00,(byte)0x13,(byte)0x00,(byte)0x14,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x6F,(byte)0x75,(byte)0x74,(byte)0x01,(byte)0x00,(byte)0x15,(byte)0x4C,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x69,(byte)0x6F,(byte)0x2F,(byte)0x50,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x65,(byte)0x61,(byte)0x6D,(byte)0x3B,(byte)0x08,(byte)0x00,(byte)0x16,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x5B,(byte)0x53,(byte)0x59,(byte)0x53,(byte)0x54,(byte)0x45,(byte)0x4D,(byte)0x5D,(byte)0x20,(byte)0x4D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x0A,(byte)0x00,(byte)0x18,(byte)0x00,(byte)0x1A,(byte)0x07,(byte)0x00,(byte)0x19,(byte)0x01,(byte)0x00,(byte)0x13,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x69,(byte)0x6F,(byte)0x2F,(byte)0x50,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x65,(byte)0x61,(byte)0x6D,(byte)0x0C,(byte)0x00,(byte)0x1B,(byte)0x00,(byte)0x1C,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x70,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x6C,(byte)0x6E,(byte)0x01,(byte)0x00,(byte)0x15,(byte)0x28,(byte)0x4C,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x67,(byte)0x3B,(byte)0x29,(byte)0x56,(byte)0x01,(byte)0x00,(byte)0x0A,(byte)0x53,(byte)0x6F,(byte)0x75,(byte)0x72,(byte)0x63,(byte)0x65,(byte)0x46,(byte)0x69,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x12,(byte)0x73,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x2E,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x00,(byte)0x21,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x2F,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x2A,(byte)0xB7,(byte)0x00,(byte)0x08,(byte)0xB1,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0B,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x0D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x0E,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x37,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x09,(byte)0xB2,(byte)0x00,(byte)0x0F,(byte)0x12,(byte)0x15,(byte)0xB6,(byte)0x00,(byte)0x17,(byte)0xB1,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x08,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x0B,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x09,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x0D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x1D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x1E};
        else if(name.equals(getClassNames()[1]))
            return new byte[] {(byte)0xCA,(byte)0xFE,(byte)0xBA,(byte)0xBE,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x34,(byte)0x00,(byte)0x25,(byte)0x07,(byte)0x00,(byte)0x02,(byte)0x01,(byte)0x00,(byte)0x0E,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x53,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x63,(byte)0x6C,(byte)0x61,(byte)0x73,(byte)0x73,(byte)0x07,(byte)0x00,(byte)0x04,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x4F,(byte)0x62,(byte)0x6A,(byte)0x65,(byte)0x63,(byte)0x74,(byte)0x01,(byte)0x00,(byte)0x06,(byte)0x3C,(byte)0x69,(byte)0x6E,(byte)0x69,(byte)0x74,(byte)0x3E,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x28,(byte)0x29,(byte)0x56,(byte)0x01,(byte)0x00,(byte)0x04,(byte)0x43,(byte)0x6F,(byte)0x64,(byte)0x65,(byte)0x0A,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x09,(byte)0x0C,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x06,(byte)0x01,(byte)0x00,(byte)0x0F,(byte)0x4C,(byte)0x69,(byte)0x6E,(byte)0x65,(byte)0x4E,(byte)0x75,(byte)0x6D,(byte)0x62,(byte)0x65,(byte)0x72,(byte)0x54,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x12,(byte)0x4C,(byte)0x6F,(byte)0x63,(byte)0x61,(byte)0x6C,(byte)0x56,(byte)0x61,(byte)0x72,(byte)0x69,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x54,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x04,(byte)0x74,(byte)0x68,(byte)0x69,(byte)0x73,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x4C,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x53,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x63,(byte)0x6C,(byte)0x61,(byte)0x73,(byte)0x73,(byte)0x3B,(byte)0x01,(byte)0x00,(byte)0x0B,(byte)0x73,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x6D,(byte)0x65,(byte)0x74,(byte)0x68,(byte)0x6F,(byte)0x64,(byte)0x09,(byte)0x00,(byte)0x10,(byte)0x00,(byte)0x12,(byte)0x07,(byte)0x00,(byte)0x11,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x53,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x0C,(byte)0x00,(byte)0x13,(byte)0x00,(byte)0x14,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x6F,(byte)0x75,(byte)0x74,(byte)0x01,(byte)0x00,(byte)0x15,(byte)0x4C,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x69,(byte)0x6F,(byte)0x2F,(byte)0x50,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x65,(byte)0x61,(byte)0x6D,(byte)0x3B,(byte)0x08,(byte)0x00,(byte)0x16,(byte)0x01,(byte)0x00,(byte)0x0B,(byte)0x53,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x4D,(byte)0x65,(byte)0x74,(byte)0x68,(byte)0x6F,(byte)0x64,(byte)0x0A,(byte)0x00,(byte)0x18,(byte)0x00,(byte)0x1A,(byte)0x07,(byte)0x00,(byte)0x19,(byte)0x01,(byte)0x00,(byte)0x13,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x69,(byte)0x6F,(byte)0x2F,(byte)0x50,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x65,(byte)0x61,(byte)0x6D,(byte)0x0C,(byte)0x00,(byte)0x1B,(byte)0x00,(byte)0x1C,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x70,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x6C,(byte)0x6E,(byte)0x01,(byte)0x00,(byte)0x15,(byte)0x28,(byte)0x4C,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x67,(byte)0x3B,(byte)0x29,(byte)0x56,(byte)0x07,(byte)0x00,(byte)0x1E,(byte)0x01,(byte)0x00,(byte)0x11,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x73,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x0A,(byte)0x00,(byte)0x1D,(byte)0x00,(byte)0x09,(byte)0x0A,(byte)0x00,(byte)0x1D,(byte)0x00,(byte)0x21,(byte)0x0C,(byte)0x00,(byte)0x22,(byte)0x00,(byte)0x06,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x0A,(byte)0x53,(byte)0x6F,(byte)0x75,(byte)0x72,(byte)0x63,(byte)0x65,(byte)0x46,(byte)0x69,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x0F,(byte)0x53,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x63,(byte)0x6C,(byte)0x61,(byte)0x73,(byte)0x73,(byte)0x2E,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x00,(byte)0x21,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x2F,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x2A,(byte)0xB7,(byte)0x00,(byte)0x08,(byte)0xB1,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0B,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x0D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x0E,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x45,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x13,(byte)0xB2,(byte)0x00,(byte)0x0F,(byte)0x12,(byte)0x15,(byte)0xB6,(byte)0x00,(byte)0x17,(byte)0xBB,(byte)0x00,(byte)0x1D,(byte)0x59,(byte)0xB7,(byte)0x00,(byte)0x1F,(byte)0xB6,(byte)0x00,(byte)0x20,(byte)0xB1,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0E,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x08,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x12,(byte)0x00,(byte)0x08,(byte)0x00,(byte)0x0B,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x13,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x0D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x23,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x24};
        return null;
       }

        public static String[] getClassNames() 
        {
            return new String[] {"a.b.systemmessage","a.b.Startclass"};
        }
}

带字节的 ClassLoader

public class byteClassLoader extends ClassLoader 
{
    private Hashtable classes = new Hashtable(); //used to cache already defined classes
    private byte[] cbytes;
    public byteClassLoader(byte[] bytes) 
    {
        super(byteClassLoader.class.getClassLoader()); //calls the parent class loader's constructor
        this.cbytes = bytes;
    }

    public Class loadClass(String className) throws ClassNotFoundException {
        return findClass(className);
    }

    public Class findClass(String className) {
        byte classByte[];
        Class result = null;

        result = (Class) classes.get(className); //checks in cached classes
        if (result != null) {
            return result;
        }

        try {
            return findSystemClass(className);
        } catch (Exception e) 
        {
        }

        try
        {
            classByte = cbytes;
            result = defineClass(className, classByte, 0, classByte.length, null);
            classes.put(className, result);
            cbytes = new byte[]{};
            return result;
        }catch(Exception e)
        {
            return null;
        }
    }

}

现在下面是我要执行的课程。

Startclass 的 startmethod() 是起点。




public class Startclass 
{
    public void startmethod()
    {
        System.out.println("StartMethod");
        new systemmessage().message();
    }
}

public class systemmessage {

    public void message()
    {
        System.out.println("[SYSTEM] Message");
    }
}

但这里有例外。




在sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)在 sun.reflect.NativeMethodAccessorImpl.invoke0
(Native Method)在 sun.reflect.DelegatingMethodAccessorImpl.invoke( DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 a.Loader.load(Loader.java:12) 在 a.MainC.main(MainC.java:10) 引起作者:java.lang.ClassFormatError: 在 java.lang.ClassLoader.defineClass(ClassLoader.java:763) 处的 java.lang.ClassLoader.defineClass1(Native Method)处的类文件被截断










在 a.byteClassLoader.findClass(byteClassLoader.java:38)
在 a.byteClassLoader.loadClass(byteClassLoader.java:17)
在 abStartclass.startmethod(Startclass.java:7)
... 还有 6 个

谢谢你。

4

1 回答 1

0

AClassLoader必须能够根据请求提供类,例如,当 JVM 试图通过定义类本身或委托给将定义它的类加载器来解决类依赖关系时。因此,尽管存在依赖关系,但为每个类创建独立的类加载器肯定会失败。无论实际请求的是哪个类,都试图使用指定的字节码定义类,这会使事情变得更糟。由于您在第一次请求后将数组设置为零长度数组,因此第二次尝试将失败并显示“<em>ClassFormatError: Truncated class file”,但如果您没有使用零长度数组,则消息只是更改为“名称不匹配”作为字节码不适合所请求的类。

另一方面,实现一个正确的类加载器比你做的要简单得多。loadClass继承自的实现java.lang.ClassLoader已经关心委托以查找父加载器的类(包括系统类)或返回已经存在的类。如果您知道该类,您只需要实现findClass将只为不存在的类调用来执行实际操作。defineClass

然后,应用程序只需调用loadClass它想要使用的类,JVM 将解决依赖关系。

import java.util.HashMap;
import java.util.Map;

public class ByteCodeClassLoader extends ClassLoader {
    final Map<String, byte[]> classes;

    public ByteCodeClassLoader(Map<String, byte[]> classes) {
        if(classes == null) throw new NullPointerException();
        this.classes = classes;
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        byte[] code = classes.get(name);
        if(code!=null) return defineClass(name, code, 0, code.length);
        return super.findClass(name); // will throw ClassNotFoundException
    }

    public static void main(String[] args) {
        Map<String, byte[]> def = new HashMap<>();
        def.put("a.b.systemmessage", new byte[] {(byte)0xCA,(byte)0xFE,(byte)0xBA,(byte)0xBE,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x34,(byte)0x00,(byte)0x1F,(byte)0x07,(byte)0x00,(byte)0x02,(byte)0x01,(byte)0x00,(byte)0x11,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x73,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x07,(byte)0x00,(byte)0x04,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x4F,(byte)0x62,(byte)0x6A,(byte)0x65,(byte)0x63,(byte)0x74,(byte)0x01,(byte)0x00,(byte)0x06,(byte)0x3C,(byte)0x69,(byte)0x6E,(byte)0x69,(byte)0x74,(byte)0x3E,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x28,(byte)0x29,(byte)0x56,(byte)0x01,(byte)0x00,(byte)0x04,(byte)0x43,(byte)0x6F,(byte)0x64,(byte)0x65,(byte)0x0A,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x09,(byte)0x0C,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x06,(byte)0x01,(byte)0x00,(byte)0x0F,(byte)0x4C,(byte)0x69,(byte)0x6E,(byte)0x65,(byte)0x4E,(byte)0x75,(byte)0x6D,(byte)0x62,(byte)0x65,(byte)0x72,(byte)0x54,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x12,(byte)0x4C,(byte)0x6F,(byte)0x63,(byte)0x61,(byte)0x6C,(byte)0x56,(byte)0x61,(byte)0x72,(byte)0x69,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x54,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x04,(byte)0x74,(byte)0x68,(byte)0x69,(byte)0x73,(byte)0x01,(byte)0x00,(byte)0x13,(byte)0x4C,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x73,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x3B,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x09,(byte)0x00,(byte)0x10,(byte)0x00,(byte)0x12,(byte)0x07,(byte)0x00,(byte)0x11,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x53,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x0C,(byte)0x00,(byte)0x13,(byte)0x00,(byte)0x14,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x6F,(byte)0x75,(byte)0x74,(byte)0x01,(byte)0x00,(byte)0x15,(byte)0x4C,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x69,(byte)0x6F,(byte)0x2F,(byte)0x50,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x65,(byte)0x61,(byte)0x6D,(byte)0x3B,(byte)0x08,(byte)0x00,(byte)0x16,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x5B,(byte)0x53,(byte)0x59,(byte)0x53,(byte)0x54,(byte)0x45,(byte)0x4D,(byte)0x5D,(byte)0x20,(byte)0x4D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x0A,(byte)0x00,(byte)0x18,(byte)0x00,(byte)0x1A,(byte)0x07,(byte)0x00,(byte)0x19,(byte)0x01,(byte)0x00,(byte)0x13,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x69,(byte)0x6F,(byte)0x2F,(byte)0x50,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x65,(byte)0x61,(byte)0x6D,(byte)0x0C,(byte)0x00,(byte)0x1B,(byte)0x00,(byte)0x1C,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x70,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x6C,(byte)0x6E,(byte)0x01,(byte)0x00,(byte)0x15,(byte)0x28,(byte)0x4C,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x67,(byte)0x3B,(byte)0x29,(byte)0x56,(byte)0x01,(byte)0x00,(byte)0x0A,(byte)0x53,(byte)0x6F,(byte)0x75,(byte)0x72,(byte)0x63,(byte)0x65,(byte)0x46,(byte)0x69,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x12,(byte)0x73,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x2E,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x00,(byte)0x21,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x2F,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x2A,(byte)0xB7,(byte)0x00,(byte)0x08,(byte)0xB1,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0B,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x0D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x0E,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x37,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x09,(byte)0xB2,(byte)0x00,(byte)0x0F,(byte)0x12,(byte)0x15,(byte)0xB6,(byte)0x00,(byte)0x17,(byte)0xB1,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x08,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x0B,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x09,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x0D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x1D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x1E});
        def.put("a.b.Startclass", new byte[] {(byte)0xCA,(byte)0xFE,(byte)0xBA,(byte)0xBE,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x34,(byte)0x00,(byte)0x25,(byte)0x07,(byte)0x00,(byte)0x02,(byte)0x01,(byte)0x00,(byte)0x0E,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x53,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x63,(byte)0x6C,(byte)0x61,(byte)0x73,(byte)0x73,(byte)0x07,(byte)0x00,(byte)0x04,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x4F,(byte)0x62,(byte)0x6A,(byte)0x65,(byte)0x63,(byte)0x74,(byte)0x01,(byte)0x00,(byte)0x06,(byte)0x3C,(byte)0x69,(byte)0x6E,(byte)0x69,(byte)0x74,(byte)0x3E,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x28,(byte)0x29,(byte)0x56,(byte)0x01,(byte)0x00,(byte)0x04,(byte)0x43,(byte)0x6F,(byte)0x64,(byte)0x65,(byte)0x0A,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x09,(byte)0x0C,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x06,(byte)0x01,(byte)0x00,(byte)0x0F,(byte)0x4C,(byte)0x69,(byte)0x6E,(byte)0x65,(byte)0x4E,(byte)0x75,(byte)0x6D,(byte)0x62,(byte)0x65,(byte)0x72,(byte)0x54,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x12,(byte)0x4C,(byte)0x6F,(byte)0x63,(byte)0x61,(byte)0x6C,(byte)0x56,(byte)0x61,(byte)0x72,(byte)0x69,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x54,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x04,(byte)0x74,(byte)0x68,(byte)0x69,(byte)0x73,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x4C,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x53,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x63,(byte)0x6C,(byte)0x61,(byte)0x73,(byte)0x73,(byte)0x3B,(byte)0x01,(byte)0x00,(byte)0x0B,(byte)0x73,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x6D,(byte)0x65,(byte)0x74,(byte)0x68,(byte)0x6F,(byte)0x64,(byte)0x09,(byte)0x00,(byte)0x10,(byte)0x00,(byte)0x12,(byte)0x07,(byte)0x00,(byte)0x11,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x53,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x0C,(byte)0x00,(byte)0x13,(byte)0x00,(byte)0x14,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x6F,(byte)0x75,(byte)0x74,(byte)0x01,(byte)0x00,(byte)0x15,(byte)0x4C,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x69,(byte)0x6F,(byte)0x2F,(byte)0x50,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x65,(byte)0x61,(byte)0x6D,(byte)0x3B,(byte)0x08,(byte)0x00,(byte)0x16,(byte)0x01,(byte)0x00,(byte)0x0B,(byte)0x53,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x4D,(byte)0x65,(byte)0x74,(byte)0x68,(byte)0x6F,(byte)0x64,(byte)0x0A,(byte)0x00,(byte)0x18,(byte)0x00,(byte)0x1A,(byte)0x07,(byte)0x00,(byte)0x19,(byte)0x01,(byte)0x00,(byte)0x13,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x69,(byte)0x6F,(byte)0x2F,(byte)0x50,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x65,(byte)0x61,(byte)0x6D,(byte)0x0C,(byte)0x00,(byte)0x1B,(byte)0x00,(byte)0x1C,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x70,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x6C,(byte)0x6E,(byte)0x01,(byte)0x00,(byte)0x15,(byte)0x28,(byte)0x4C,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x67,(byte)0x3B,(byte)0x29,(byte)0x56,(byte)0x07,(byte)0x00,(byte)0x1E,(byte)0x01,(byte)0x00,(byte)0x11,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x73,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x0A,(byte)0x00,(byte)0x1D,(byte)0x00,(byte)0x09,(byte)0x0A,(byte)0x00,(byte)0x1D,(byte)0x00,(byte)0x21,(byte)0x0C,(byte)0x00,(byte)0x22,(byte)0x00,(byte)0x06,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x0A,(byte)0x53,(byte)0x6F,(byte)0x75,(byte)0x72,(byte)0x63,(byte)0x65,(byte)0x46,(byte)0x69,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x0F,(byte)0x53,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x63,(byte)0x6C,(byte)0x61,(byte)0x73,(byte)0x73,(byte)0x2E,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x00,(byte)0x21,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x2F,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x2A,(byte)0xB7,(byte)0x00,(byte)0x08,(byte)0xB1,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0B,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x0D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x0E,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x45,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x13,(byte)0xB2,(byte)0x00,(byte)0x0F,(byte)0x12,(byte)0x15,(byte)0xB6,(byte)0x00,(byte)0x17,(byte)0xBB,(byte)0x00,(byte)0x1D,(byte)0x59,(byte)0xB7,(byte)0x00,(byte)0x1F,(byte)0xB6,(byte)0x00,(byte)0x20,(byte)0xB1,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0E,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x08,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x12,(byte)0x00,(byte)0x08,(byte)0x00,(byte)0x0B,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x13,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x0D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x23,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x24});
        ClassLoader cl = new ByteCodeClassLoader(def);
        try {
            Class clz = cl.loadClass("a.b.Startclass");
            clz.getDeclaredMethod("startmethod").invoke(clz.newInstance());
        } catch(ReflectiveOperationException ex) {
            throw new RuntimeException(ex);
        }
    }
}

就这样。

于 2017-09-12T14:26:22.643 回答