У меня есть определение проблемы, где мне нужно создать тип класса и добавить поля, методы к нему во время выполнения в Java. Когда у меня есть объект Class определенного типа, я могу создать экземпляр этого класса.
В основном мне запрещено вносить изменения в байт-код или выполнять операции с диском. Просто нужно сделать операцию в памяти.
Я также попытался расширить java.lang.ClassLoader и предоставить собственную реализацию defineClass (). Но этот метод является окончательным, поэтому не может переопределить его.
Пробовал ниже код, но не помогло:
public class MethodParameterSpy {
public static class MyClassLoader extends ClassLoader{
public Class loadClass(String name) throws ClassNotFoundException {
return defineClass("MyObject","public class Demo{ int i; }".getBytes(), 0,"public class Demo{}".getBytes().length+1);
}
}
public static void main(String... args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
ClassLoader clloader=new MethodParameterSpy.MyClassLoader();
Class c=clloader.loadClass(null);
System.out.println(c);
}
}
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 1886741100 in class file MyObject
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at MethodParameterSpy$MyClassLoader.loadClass(MethodParameterSpy.java:71)
at MethodParameterSpy.main(MethodParameterSpy.java:78)