diff --git a/Reflect/pom.xml b/Reflect/pom.xml index ff10131..faff0f6 100644 --- a/Reflect/pom.xml +++ b/Reflect/pom.xml @@ -23,5 +23,11 @@ 4.12 test + + org.ow2.asm + asm-all + 5.1 + test + \ No newline at end of file diff --git a/Reflect/src/test/java/eu/mikroskeem/utils/test/reflect/TestReflect.java b/Reflect/src/test/java/eu/mikroskeem/utils/test/reflect/TestReflect.java index 3eba74a..8fc327a 100644 --- a/Reflect/src/test/java/eu/mikroskeem/utils/test/reflect/TestReflect.java +++ b/Reflect/src/test/java/eu/mikroskeem/utils/test/reflect/TestReflect.java @@ -3,10 +3,17 @@ package eu.mikroskeem.utils.test.reflect; import eu.mikroskeem.utils.reflect.Reflect; import org.junit.Assert; import org.junit.Test; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.FieldVisitor; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Type; import java.lang.reflect.Field; import java.lang.reflect.Method; +import static org.objectweb.asm.Opcodes.*; +import static org.objectweb.asm.Opcodes.RETURN; + public class TestReflect { @Test public void testGetClass(){ @@ -75,4 +82,34 @@ public class TestReflect { Reflect.simpleWriteField(testClass, "FOOBAR", "yeah"); Assert.assertEquals("yeah", Reflect.simpleReadField(testClass, "FOOBAR")); } + + @Test + public void testClassLoading(){ + String className = "eu.mikroskeem.utils.test.reflect.GeneratedTestClass"; + String classNameInternal = className.replaceAll("\\.", "/"); + + ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES); + cw.visit( + V1_8, + ACC_PUBLIC + ACC_SUPER, + classNameInternal, + null, + Type.getInternalName(Object.class), + null); + FieldVisitor fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "test", Type.getDescriptor(String.class), null, "hey"); + fv.visitEnd(); + MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, Type.getInternalName(Object.class), "", "()V", false); + mv.visitInsn(RETURN); + mv.visitMaxs(0, 0); + mv.visitEnd(); + cw.visitEnd(); + + Class generated = Reflect.defineClass(ClassLoader.getSystemClassLoader(), className, cw.toByteArray()); + Field testField = Reflect.getField(generated, "test"); + String testFieldContent = (String) Reflect.readField(testField, null); + Assert.assertTrue(Reflect.classExists(className)); + Assert.assertEquals("hey", testFieldContent); + } }