116 lines
4.5 KiB
Java
116 lines
4.5 KiB
Java
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(){
|
|
Assert.assertEquals(String.class, Reflect.getClass("java.lang.String"));
|
|
Assert.assertNotEquals(String.class, Reflect.getClass("java.lang.Integer"));
|
|
}
|
|
|
|
@Test
|
|
public void testClassFind(){
|
|
Assert.assertTrue(Reflect.classExists("java.lang.String"));
|
|
Assert.assertFalse(Reflect.classExists("foo.bar.baz.xyz"));
|
|
}
|
|
|
|
@Test
|
|
public void testGetMethod(){
|
|
Class reflectClass = Reflect.getClass("eu.mikroskeem.utils.reflect.Reflect");
|
|
Method method = Reflect.getMethod(reflectClass, "getClass", String.class);
|
|
Assert.assertNotNull(method);
|
|
Method invalidMethod = Reflect.getMethod(reflectClass, "getClass", Integer.class);
|
|
Assert.assertNull(invalidMethod);
|
|
}
|
|
|
|
@Test
|
|
public void testInvokeMethod(){
|
|
Class reflectClass = Reflect.getClass("eu.mikroskeem.utils.reflect.Reflect");
|
|
Method method = Reflect.getMethod(reflectClass, "getClass", String.class);
|
|
Class<?> resultClazz = (Class)Reflect.invokeMethod(method, null, "java.lang.String");
|
|
Assert.assertEquals(String.class, resultClazz);
|
|
}
|
|
|
|
@Test
|
|
public void testGetField(){
|
|
Class reflectTestClass = Reflect.getClass("eu.mikroskeem.utils.test.reflect.ReflectionTestClass");
|
|
Field foobarField = Reflect.getField(reflectTestClass, "FOOBAR");
|
|
Assert.assertNotNull(foobarField);
|
|
Field invalidField = Reflect.getField(reflectTestClass, "ROOMAZ");
|
|
Assert.assertNull(invalidField);
|
|
}
|
|
|
|
@Test
|
|
public void testReadField(){
|
|
Class reflectTestClass = Reflect.getClass("eu.mikroskeem.utils.test.reflect.ReflectionTestClass");
|
|
Field foobarField = Reflect.getField(reflectTestClass, "FOOBAR");
|
|
String value = (String)Reflect.readField(foobarField, null);
|
|
Assert.assertEquals("nope", value);
|
|
}
|
|
|
|
@Test
|
|
public void testWriteField(){
|
|
Class reflectTestClass = Reflect.getClass("eu.mikroskeem.utils.test.reflect.ReflectionTestClass");
|
|
Field bazfed = Reflect.getField(reflectTestClass, "BAZFED");
|
|
Reflect.writeField(bazfed, null, "no yeah man :(");
|
|
String value = (String)Reflect.readField(bazfed, null);
|
|
Assert.assertEquals("no yeah man :(", value);
|
|
}
|
|
|
|
@Test
|
|
public void testSimpleReadField(){
|
|
SimpleReflectionTestClass testClass = new SimpleReflectionTestClass();
|
|
Assert.assertEquals("nope", Reflect.simpleReadField(testClass, "FOOBAR"));
|
|
}
|
|
|
|
@Test
|
|
public void testSimpleWriteField(){
|
|
SimpleReflectionTestClass testClass = new SimpleReflectionTestClass();
|
|
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);
|
|
}
|
|
}
|