我正在尝试将一个类加载到一个字节数组中。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 个
谢谢你。