Это два примера файлов, которые я хочу проверить сгенерированный байт-код (генерация байт-кода работает нормально):
Код: Выделить всё
public class MultipleClasses1 {
MultipleClasses2 anotherClass;
public MultipleClasses1() {
this.anotherClass = new MultipleClasses2();
}
public int getIFromAnotherClass() {
return this.anotherClass.i;
}
}
Код: Выделить всё
public class MultipleClasses2 {
int i;
public MultipleClasses2() {
this.i = 4;
}
}
Код: Выделить всё
public class BytecodeTestUtil {
private final Class clazz;
private final Object instance;
private static final Logger LOGGER = Logger.getLogger(BytecodeTestUtil.class.getName());
public BytecodeTestUtil(List sourceFilePaths, String className) throws Exception {
byte[] resultBytecode = new byte[0];
for (byte[] bytecode : Compiler.generateByteCodeArrayFromFiles(sourceFilePaths)) {
int neededLength = resultBytecode.length + bytecode.length;
byte[] result = new byte[neededLength];
System.arraycopy(resultBytecode, 0, result, 0, resultBytecode.length);
System.arraycopy(bytecode, 0, result, resultBytecode.length, bytecode.length);
resultBytecode = result;
}
byte[] finalResultBytecode = resultBytecode;
ClassLoader classLoader = new ClassLoader() {
@Override
protected Class findClass(String name) {
return defineClass(name, finalResultBytecode, 0, finalResultBytecode.length);
}
};
try {
clazz = classLoader.loadClass(className);
this.instance = clazz.getDeclaredConstructor().newInstance();
} catch (ClassNotFoundException | SecurityException | NoSuchMethodException e) {
LOGGER.log(Level.SEVERE, "Exception occur", e);
throw new RuntimeException(e);
}
}
}
Если я просто загружаю файл класса для класса MultipleClasses1, я получаю исключение "java.lang.NoClassDefFoundError: MultipleClasses2 (неправильное имя: MultipleClasses1)"Я также пытался установить этот собственный ClassLoader:
Код: Выделить всё
public class ByteClassLoader extends ClassLoader {
// Map to store the class name and its corresponding byte array
private final Map classesBytes = new HashMap();
public ByteClassLoader() {
super(ClassLoader.getSystemClassLoader());
}
// Method to add a class byte array to the loader
public void addClass(String name, byte[] classData) {
classesBytes.put(name, classData);
}
@Override
protected Class findClass(String name) throws ClassNotFoundException {
byte[] classData = classesBytes.get(name);
if (classData == null) {
throw new ClassNotFoundException(name);
}
return defineClass(name, classData, 0, classData.length);
}
}
У вас есть другие идеи?
Подробнее здесь: https://stackoverflow.com/questions/786 ... eflections
Мобильная версия