I am trying to load a class into a byte array. MainC, Loader, ClassByte, and byteClassLoader are all to load classes.
MainC is start point.
public class MainC
{
public static void main(String[] args) {
Loader loc = new Loader();
loc.load();
}
}
Here we load the class and invoke the method.
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);
}
}
}
Here we can get the class and byte array to load.
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"};
}
}
The ClassLoader with bytes
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;
}
}
}
Now below is classes that i want to excute.
Startclass's startmethod() is start point.
public class Startclass
{
public void startmethod()
{
System.out.println("StartMethod");
new systemmessage().message();
}
}
and
public class systemmessage {
public void message()
{
System.out.println("[SYSTEM] Message");
}
}
but here is exceptions.
StartMethod
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at a.Loader.load(Loader.java:12)
at a.MainC.main(MainC.java:10)
Caused by: java.lang.ClassFormatError: Truncated class file
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at a.byteClassLoader.findClass(byteClassLoader.java:38)
at a.byteClassLoader.loadClass(byteClassLoader.java:17)
at abStartclass.startmethod(Startclass.java:7)
... 6 more
Thankyou.
A ClassLoader
must be able to provide classes on request, eg when the JVM tries to resolve class dependencies, either by defining the class itself or delegating to the class loader which will define it. Therefore, creating an independent class loader for each class despite there are dependencies must fail. You make matters worse by trying to define the class using the specified byte code regardless of which class has been actually requested. Since you set the array to a zero length array after the first request, the second attempt will fail with a “ ClassFormatError: Truncated class file ”, but if you didn't use the zero length array, the message just changed to “Name mismatch” as the byte code is inappropriate for the requested class.
On the other hand, implementing a correct class loader is much simpler than what you do. The loadClass
implementation inherited from java.lang.ClassLoader
does already care about delegation to find classes of the parent loader (including system classes) or to return already existing classes. You only have to implement findClass
which will be invoked only for non-existing classes to do an actual defineClass
if you know that class.
Then, the application only has to invoke loadClass
for the class it wants to use, the JVM will resolve the dependencies.
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);
}
}
}
That's all.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.