Add unit test for reflective class loading

This commit is contained in:
Mark Vainomaa 2016-12-22 02:44:13 +02:00
parent 373156eedd
commit 7aee354eb2
2 changed files with 43 additions and 0 deletions

View File

@ -23,5 +23,11 @@
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm-all</artifactId>
<version>5.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@ -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, "<init>", "()V", null, null);
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, Type.getInternalName(Object.class), "<init>", "()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);
}
}