Тестирование нескольких классов с зависимостями с отражениямиJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Тестирование нескольких классов с зависимостями с отражениями

Сообщение Anonymous »

Недавно мы создавали Java-компилятор для колледжа, и нам нужно протестировать наши скомпилированные файлы с помощью Java-отражений. До сих пор у меня не было проблем с этим инструментом. Нам нужно проверить, работают ли несколько файлов с зависимостями друг от друга. Итак, у нас есть два byte[], один из них содержит класс, который я хочу протестировать, другой содержит класс, из которого у первого есть объект (внизу). Я хочу создать из этих файлов объект класса, в котором я могу выполнять такие методы, как «getDeclardConstructors». Объект класса должен содержать первый класс. Но у меня проблема: я не могу понять, как заставить это работать. Как вы думаете, вы можете мне помочь?
Это два примера файлов, которые я хочу проверить сгенерированный байт-код (генерация байт-кода работает нормально):

Код: Выделить всё

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;
}
}
Это файл, который помогает мне получить объект Class:

Код: Выделить всё

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);
}
}
}
Как вы видите, я попытался просто поместить код обоих классов в один байт[], но при компиляции я просто получаю ошибку «java.lang.ClassFormatError: Дополнительные байты в конец файла класса MultipleClasses1"
Если я просто загружаю файл класса для класса 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»