Как получить и использовать тип класса из класса Java, который я динамически создал во время выполнения с использованием ASM?

Я хотел бы расширить класс, получить литерал класса, использовать его в качестве параметра типа или привести к нему.

У меня уже есть обходной путь, но мне все еще интересно.

В настоящее время я могу определить класс во время выполнения с ASM, создать экземпляр с Object введите и вызовите его методы с отражением, но я не знаю, как использовать его как тип класса.

Конечно, компилятор не знает о классах, определенных во время выполнения, но в этом случае я знаю об этом, и я думаю, что я вижу его скрытым в файле ASMified .java (пример ниже). Как убедить компилятор в том, что он действительно знает тип класса во время компиляции?

Спасибо, что посмотрели,

-Julian

Пример ASMified класса B: генерирующий байт-код код, который подделывает class B{String hello = "Hello B!"}:

import java.util.*;
import org.objectweb.asm.*;
//import org.objectweb.asm.attrs.*;
public class BDump implements Opcodes {

public static byte[] dump () throws Exception {

ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;
MethodVisitor mv;
AnnotationVisitor av0;

cw.visit(V1_6, ACC_SUPER, "B", null, "java/lang/Object", null);

{
fv = cw.visitField(0, "hello", "Ljava/lang/String;", null, null);
fv.visitEnd();
}
{
mv = cw.visitMethod(0, "<init>", "()V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
mv.visitVarInsn(ALOAD, 0);
mv.visitLdcInsn("Hello B!");
mv.visitFieldInsn(PUTFIELD, "B", "hello", "Ljava/lang/String;");
mv.visitInsn(RETURN);
mv.visitMaxs(2, 1);
mv.visitEnd();
}
cw.visitEnd();

return cw.toByteArray();
}
}

1 ответ

Вы не можете использовать класс во время компиляции, который не существует во время компиляции. Что вы можете сделать, это

  • используйте класс или интерфейс, который существует во время компиляции, но заменяется во время выполнения желаемой реализацией.
  • используйте интерфейс, который доступен во время компиляции, но реализован только во время выполнения.
  • используйте отражение, чтобы вызвать конструктор / методы во время выполнения.
Другие вопросы по тегам