Browse Source

draft: example

Mariusz Sieroń 6 năm trước cách đây
mục cha
commit
1c0ece3433

+ 0 - 2
assira.drafts/src/main/java/net/ranides/assira/reflection/Adapter.java

@@ -7,8 +7,6 @@ import net.ranides.assira.reflection.asm.cg.CGAdapter;
 
 import java.util.Map;
 
-//import net.ranides.assira.reflection.asm.impl.VMNames;
-
 public class Adapter {
 
     private static Map<Tuple, IClass<?>> GENERATED = new HashMap<>();

+ 37 - 0
assira.drafts/src/test/java/net/ranides/assira/example/ExampleSupport.java

@@ -0,0 +1,37 @@
+package net.ranides.assira.example;
+
+import net.ranides.assira.reflection.IArguments;
+import net.ranides.assira.reflection.IAttribute;
+import net.ranides.assira.reflection.IClass;
+import net.ranides.assira.reflection.IMethod;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class ExampleSupport {
+
+    public static IMethod link(IClass<?> owner, String name, Class<?>... args) {
+        return owner.methods()
+                .require(IAttribute.DECLARED)
+                .require(name)
+                .require(IArguments.typeinfo(args))
+                .first()
+                .get()
+                .accessible();
+    }
+
+    // we match by types by name (string) because some of them can be private
+    public static IMethod link(IClass<?> owner, String name, String... args) {
+        List<String> strings = Arrays.asList(args);
+        return owner.methods()
+                .require(IAttribute.DECLARED)
+                .require(name)
+                .stream()
+                .filter(m -> m.arguments().types().names().equals(strings))
+//                .require(IArguments.typeinfo(args))
+                .first()
+                .get()
+                .accessible();
+    }
+
+}

+ 28 - 0
assira.drafts/src/test/java/net/ranides/assira/example/IRecord4Proxy.java

@@ -1,5 +1,9 @@
 package net.ranides.assira.example;
 
+import net.ranides.assira.reflection.IArguments;
+import net.ranides.assira.reflection.IAttribute;
+import net.ranides.assira.reflection.IClass;
+import net.ranides.assira.reflection.IMethod;
 import net.ranides.assira.reflection.adapter.example.AbstractRecord;
 import net.ranides.assira.reflection.adapter.example.InnerDefs;
 
@@ -48,6 +52,30 @@ public class IRecord4Proxy implements InnerDefs.IRecord3 {
         return that.args1((int[])a, (Float[])b, (Number) c);
     }
 
+    public String args1map(Object a, int b, char c) {
+        return that.args1(change1(a), change2(b), change3(c));
+    }
+
+    private int[] change1(Object a) {
+        return new int[0];
+    }
+
+    private Float[] change2(int b) {
+        return new Float[0];
+    }
+
+    private Number change3(char c) {
+        return 33;
+    }
+
+    private static final IClass<?> I_CLASS = IClass.typeinfo(InnerDefs.Record.class);
+
+    private static final IMethod ARGS1 = ExampleSupport.link(I_CLASS, "args1", "[I", "[Ljava\\lang\\Float;", "Ljava\\lang\\Number;", "a", "b", "c", "d", "e", "f", "g", "h");
+
+    public String args1reflect(int[] a, Float[] b, Number c) {
+        return (String)ARGS1.$invoke(that, a, b, c);
+    }
+
     @Override
     public String complex(List<String> list, Map<String, Number> map) throws NumberFormatException, IllegalStateException {
         return that.complex(list, map);

+ 200 - 13
assira.drafts/src/test/java/net/ranides/assira/example/IRecord4ProxyDump.java

@@ -29,6 +29,8 @@ public class IRecord4ProxyDump implements Opcodes {
 
         classWriter.visitInnerClass("net/ranides/assira/reflection/adapter/example/InnerDefs$RecordStats", "net/ranides/assira/reflection/adapter/example/InnerDefs", "RecordStats", ACC_PUBLIC | ACC_STATIC);
 
+        classWriter.visitInnerClass("net/ranides/assira/reflection/adapter/example/InnerDefs$Record", "net/ranides/assira/reflection/adapter/example/InnerDefs", "Record", ACC_PUBLIC | ACC_STATIC);
+
         classWriter.visitInnerClass("net/ranides/assira/reflection/adapter/example/InnerDefs$IRecord3", "net/ranides/assira/reflection/adapter/example/InnerDefs", "IRecord3", ACC_PUBLIC | ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE);
 
         classWriter.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup", ACC_PUBLIC | ACC_FINAL | ACC_STATIC);
@@ -37,23 +39,31 @@ public class IRecord4ProxyDump implements Opcodes {
             fieldVisitor = classWriter.visitField(ACC_PRIVATE | ACC_FINAL, "that", "Lnet/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord;", null, null);
             fieldVisitor.visitEnd();
         }
+        {
+            fieldVisitor = classWriter.visitField(ACC_PRIVATE | ACC_FINAL | ACC_STATIC, "I_CLASS", "Lnet/ranides/assira/reflection/IClass;", "Lnet/ranides/assira/reflection/IClass<*>;", null);
+            fieldVisitor.visitEnd();
+        }
+        {
+            fieldVisitor = classWriter.visitField(ACC_PRIVATE | ACC_FINAL | ACC_STATIC, "ARGS1", "Lnet/ranides/assira/reflection/IMethod;", null, null);
+            fieldVisitor.visitEnd();
+        }
         {
             methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "(Lnet/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord;)V", null, null);
             methodVisitor.visitCode();
             Label label0 = new Label();
             methodVisitor.visitLabel(label0);
-            methodVisitor.visitLineNumber(13, label0);
+            methodVisitor.visitLineNumber(17, label0);
             methodVisitor.visitVarInsn(ALOAD, 0);
             methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
             Label label1 = new Label();
             methodVisitor.visitLabel(label1);
-            methodVisitor.visitLineNumber(14, label1);
+            methodVisitor.visitLineNumber(18, label1);
             methodVisitor.visitVarInsn(ALOAD, 0);
             methodVisitor.visitVarInsn(ALOAD, 1);
             methodVisitor.visitFieldInsn(PUTFIELD, "net/ranides/assira/example/IRecord4Proxy", "that", "Lnet/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord;");
             Label label2 = new Label();
             methodVisitor.visitLabel(label2);
-            methodVisitor.visitLineNumber(15, label2);
+            methodVisitor.visitLineNumber(19, label2);
             methodVisitor.visitInsn(RETURN);
             Label label3 = new Label();
             methodVisitor.visitLabel(label3);
@@ -67,7 +77,7 @@ public class IRecord4ProxyDump implements Opcodes {
             methodVisitor.visitCode();
             Label label0 = new Label();
             methodVisitor.visitLabel(label0);
-            methodVisitor.visitLineNumber(19, label0);
+            methodVisitor.visitLineNumber(23, label0);
             methodVisitor.visitVarInsn(ALOAD, 0);
             methodVisitor.visitFieldInsn(GETFIELD, "net/ranides/assira/example/IRecord4Proxy", "that", "Lnet/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord;");
             methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "net/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord", "getX", "()I", false);
@@ -83,7 +93,7 @@ public class IRecord4ProxyDump implements Opcodes {
             methodVisitor.visitCode();
             Label label0 = new Label();
             methodVisitor.visitLabel(label0);
-            methodVisitor.visitLineNumber(24, label0);
+            methodVisitor.visitLineNumber(28, label0);
             methodVisitor.visitVarInsn(ALOAD, 0);
             methodVisitor.visitFieldInsn(GETFIELD, "net/ranides/assira/example/IRecord4Proxy", "that", "Lnet/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord;");
             methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "net/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord", "getY", "()I", false);
@@ -99,7 +109,7 @@ public class IRecord4ProxyDump implements Opcodes {
             methodVisitor.visitCode();
             Label label0 = new Label();
             methodVisitor.visitLabel(label0);
-            methodVisitor.visitLineNumber(29, label0);
+            methodVisitor.visitLineNumber(33, label0);
             methodVisitor.visitVarInsn(ALOAD, 0);
             methodVisitor.visitFieldInsn(GETFIELD, "net/ranides/assira/example/IRecord4Proxy", "that", "Lnet/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord;");
             methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "net/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord", "area", "()I", false);
@@ -115,7 +125,7 @@ public class IRecord4ProxyDump implements Opcodes {
             methodVisitor.visitCode();
             Label label0 = new Label();
             methodVisitor.visitLabel(label0);
-            methodVisitor.visitLineNumber(34, label0);
+            methodVisitor.visitLineNumber(38, label0);
             methodVisitor.visitVarInsn(ALOAD, 0);
             methodVisitor.visitFieldInsn(GETFIELD, "net/ranides/assira/example/IRecord4Proxy", "that", "Lnet/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord;");
             methodVisitor.visitVarInsn(ILOAD, 1);
@@ -133,7 +143,7 @@ public class IRecord4ProxyDump implements Opcodes {
             methodVisitor.visitCode();
             Label label0 = new Label();
             methodVisitor.visitLabel(label0);
-            methodVisitor.visitLineNumber(39, label0);
+            methodVisitor.visitLineNumber(43, label0);
             methodVisitor.visitVarInsn(ALOAD, 0);
             methodVisitor.visitFieldInsn(GETFIELD, "net/ranides/assira/example/IRecord4Proxy", "that", "Lnet/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord;");
             methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "net/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord", "stats", "()Lnet/ranides/assira/reflection/adapter/example/InnerDefs$RecordStats;", false);
@@ -149,7 +159,7 @@ public class IRecord4ProxyDump implements Opcodes {
             methodVisitor.visitCode();
             Label label0 = new Label();
             methodVisitor.visitLabel(label0);
-            methodVisitor.visitLineNumber(44, label0);
+            methodVisitor.visitLineNumber(48, label0);
             methodVisitor.visitVarInsn(ALOAD, 0);
             methodVisitor.visitFieldInsn(GETFIELD, "net/ranides/assira/example/IRecord4Proxy", "that", "Lnet/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord;");
             methodVisitor.visitVarInsn(ALOAD, 1);
@@ -171,7 +181,7 @@ public class IRecord4ProxyDump implements Opcodes {
             methodVisitor.visitCode();
             Label label0 = new Label();
             methodVisitor.visitLabel(label0);
-            methodVisitor.visitLineNumber(48, label0);
+            methodVisitor.visitLineNumber(52, label0);
             methodVisitor.visitVarInsn(ALOAD, 0);
             methodVisitor.visitFieldInsn(GETFIELD, "net/ranides/assira/example/IRecord4Proxy", "that", "Lnet/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord;");
             methodVisitor.visitVarInsn(ALOAD, 1);
@@ -191,12 +201,123 @@ public class IRecord4ProxyDump implements Opcodes {
             methodVisitor.visitMaxs(4, 4);
             methodVisitor.visitEnd();
         }
+        {
+            methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "args1map", "(Ljava/lang/Object;IC)Ljava/lang/String;", null, null);
+            methodVisitor.visitCode();
+            Label label0 = new Label();
+            methodVisitor.visitLabel(label0);
+            methodVisitor.visitLineNumber(56, label0);
+            methodVisitor.visitVarInsn(ALOAD, 0);
+            methodVisitor.visitFieldInsn(GETFIELD, "net/ranides/assira/example/IRecord4Proxy", "that", "Lnet/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord;");
+            methodVisitor.visitVarInsn(ALOAD, 0);
+            methodVisitor.visitVarInsn(ALOAD, 1);
+            methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "net/ranides/assira/example/IRecord4Proxy", "change1", "(Ljava/lang/Object;)[I", false);
+            methodVisitor.visitVarInsn(ALOAD, 0);
+            methodVisitor.visitVarInsn(ILOAD, 2);
+            methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "net/ranides/assira/example/IRecord4Proxy", "change2", "(I)[Ljava/lang/Float;", false);
+            methodVisitor.visitVarInsn(ALOAD, 0);
+            methodVisitor.visitVarInsn(ILOAD, 3);
+            methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "net/ranides/assira/example/IRecord4Proxy", "change3", "(C)Ljava/lang/Number;", false);
+            methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "net/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord", "args1", "([I[Ljava/lang/Float;Ljava/lang/Number;)Ljava/lang/String;", false);
+            methodVisitor.visitInsn(ARETURN);
+            Label label1 = new Label();
+            methodVisitor.visitLabel(label1);
+            methodVisitor.visitLocalVariable("this", "Lnet/ranides/assira/example/IRecord4Proxy;", null, label0, label1, 0);
+            methodVisitor.visitLocalVariable("a", "Ljava/lang/Object;", null, label0, label1, 1);
+            methodVisitor.visitLocalVariable("b", "I", null, label0, label1, 2);
+            methodVisitor.visitLocalVariable("c", "C", null, label0, label1, 3);
+            methodVisitor.visitMaxs(5, 4);
+            methodVisitor.visitEnd();
+        }
+        {
+            methodVisitor = classWriter.visitMethod(ACC_PRIVATE, "change1", "(Ljava/lang/Object;)[I", null, null);
+            methodVisitor.visitCode();
+            Label label0 = new Label();
+            methodVisitor.visitLabel(label0);
+            methodVisitor.visitLineNumber(60, label0);
+            methodVisitor.visitInsn(ICONST_0);
+            methodVisitor.visitIntInsn(NEWARRAY, T_INT);
+            methodVisitor.visitInsn(ARETURN);
+            Label label1 = new Label();
+            methodVisitor.visitLabel(label1);
+            methodVisitor.visitLocalVariable("this", "Lnet/ranides/assira/example/IRecord4Proxy;", null, label0, label1, 0);
+            methodVisitor.visitLocalVariable("a", "Ljava/lang/Object;", null, label0, label1, 1);
+            methodVisitor.visitMaxs(1, 2);
+            methodVisitor.visitEnd();
+        }
+        {
+            methodVisitor = classWriter.visitMethod(ACC_PRIVATE, "change2", "(I)[Ljava/lang/Float;", null, null);
+            methodVisitor.visitCode();
+            Label label0 = new Label();
+            methodVisitor.visitLabel(label0);
+            methodVisitor.visitLineNumber(64, label0);
+            methodVisitor.visitInsn(ICONST_0);
+            methodVisitor.visitTypeInsn(ANEWARRAY, "java/lang/Float");
+            methodVisitor.visitInsn(ARETURN);
+            Label label1 = new Label();
+            methodVisitor.visitLabel(label1);
+            methodVisitor.visitLocalVariable("this", "Lnet/ranides/assira/example/IRecord4Proxy;", null, label0, label1, 0);
+            methodVisitor.visitLocalVariable("b", "I", null, label0, label1, 1);
+            methodVisitor.visitMaxs(1, 2);
+            methodVisitor.visitEnd();
+        }
+        {
+            methodVisitor = classWriter.visitMethod(ACC_PRIVATE, "change3", "(C)Ljava/lang/Number;", null, null);
+            methodVisitor.visitCode();
+            Label label0 = new Label();
+            methodVisitor.visitLabel(label0);
+            methodVisitor.visitLineNumber(68, label0);
+            methodVisitor.visitIntInsn(BIPUSH, 33);
+            methodVisitor.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false);
+            methodVisitor.visitInsn(ARETURN);
+            Label label1 = new Label();
+            methodVisitor.visitLabel(label1);
+            methodVisitor.visitLocalVariable("this", "Lnet/ranides/assira/example/IRecord4Proxy;", null, label0, label1, 0);
+            methodVisitor.visitLocalVariable("c", "C", null, label0, label1, 1);
+            methodVisitor.visitMaxs(1, 2);
+            methodVisitor.visitEnd();
+        }
+        {
+            methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "args1reflect", "([I[Ljava/lang/Float;Ljava/lang/Number;)Ljava/lang/String;", null, null);
+            methodVisitor.visitCode();
+            Label label0 = new Label();
+            methodVisitor.visitLabel(label0);
+            methodVisitor.visitLineNumber(76, label0);
+            methodVisitor.visitFieldInsn(GETSTATIC, "net/ranides/assira/example/IRecord4Proxy", "ARGS1", "Lnet/ranides/assira/reflection/IMethod;");
+            methodVisitor.visitVarInsn(ALOAD, 0);
+            methodVisitor.visitFieldInsn(GETFIELD, "net/ranides/assira/example/IRecord4Proxy", "that", "Lnet/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord;");
+            methodVisitor.visitInsn(ICONST_3);
+            methodVisitor.visitTypeInsn(ANEWARRAY, "java/lang/Object");
+            methodVisitor.visitInsn(DUP);
+            methodVisitor.visitInsn(ICONST_0);
+            methodVisitor.visitVarInsn(ALOAD, 1);
+            methodVisitor.visitInsn(AASTORE);
+            methodVisitor.visitInsn(DUP);
+            methodVisitor.visitInsn(ICONST_1);
+            methodVisitor.visitVarInsn(ALOAD, 2);
+            methodVisitor.visitInsn(AASTORE);
+            methodVisitor.visitInsn(DUP);
+            methodVisitor.visitInsn(ICONST_2);
+            methodVisitor.visitVarInsn(ALOAD, 3);
+            methodVisitor.visitInsn(AASTORE);
+            methodVisitor.visitMethodInsn(INVOKEINTERFACE, "net/ranides/assira/reflection/IMethod", "$invoke", "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;", true);
+            methodVisitor.visitTypeInsn(CHECKCAST, "java/lang/String");
+            methodVisitor.visitInsn(ARETURN);
+            Label label1 = new Label();
+            methodVisitor.visitLabel(label1);
+            methodVisitor.visitLocalVariable("this", "Lnet/ranides/assira/example/IRecord4Proxy;", null, label0, label1, 0);
+            methodVisitor.visitLocalVariable("a", "[I", null, label0, label1, 1);
+            methodVisitor.visitLocalVariable("b", "[Ljava/lang/Float;", null, label0, label1, 2);
+            methodVisitor.visitLocalVariable("c", "Ljava/lang/Number;", null, label0, label1, 3);
+            methodVisitor.visitMaxs(6, 4);
+            methodVisitor.visitEnd();
+        }
         {
             methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "complex", "(Ljava/util/List;Ljava/util/Map;)Ljava/lang/String;", "(Ljava/util/List<Ljava/lang/String;>;Ljava/util/Map<Ljava/lang/String;Ljava/lang/Number;>;)Ljava/lang/String;", new String[] { "java/lang/NumberFormatException", "java/lang/IllegalStateException" });
             methodVisitor.visitCode();
             Label label0 = new Label();
             methodVisitor.visitLabel(label0);
-            methodVisitor.visitLineNumber(53, label0);
+            methodVisitor.visitLineNumber(81, label0);
             methodVisitor.visitVarInsn(ALOAD, 0);
             methodVisitor.visitFieldInsn(GETFIELD, "net/ranides/assira/example/IRecord4Proxy", "that", "Lnet/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord;");
             methodVisitor.visitVarInsn(ALOAD, 1);
@@ -216,7 +337,7 @@ public class IRecord4ProxyDump implements Opcodes {
             methodVisitor.visitCode();
             Label label0 = new Label();
             methodVisitor.visitLabel(label0);
-            methodVisitor.visitLineNumber(58, label0);
+            methodVisitor.visitLineNumber(86, label0);
             methodVisitor.visitVarInsn(ALOAD, 0);
             methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "net/ranides/assira/example/IRecord4Proxy", "getY", "()I", false);
             methodVisitor.visitInsn(I2D);
@@ -225,7 +346,7 @@ public class IRecord4ProxyDump implements Opcodes {
             methodVisitor.visitVarInsn(DSTORE, 1);
             Label label1 = new Label();
             methodVisitor.visitLabel(label1);
-            methodVisitor.visitLineNumber(59, label1);
+            methodVisitor.visitLineNumber(87, label1);
             methodVisitor.visitVarInsn(ALOAD, 0);
             methodVisitor.visitFieldInsn(GETFIELD, "net/ranides/assira/example/IRecord4Proxy", "that", "Lnet/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord;");
             methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "net/ranides/assira/reflection/adapter/example/InnerDefs$MutableRecord", "toString", "()Ljava/lang/String;", false);
@@ -241,6 +362,72 @@ public class IRecord4ProxyDump implements Opcodes {
             methodVisitor.visitMaxs(4, 3);
             methodVisitor.visitEnd();
         }
+        {
+            methodVisitor = classWriter.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
+            methodVisitor.visitCode();
+            Label label0 = new Label();
+            methodVisitor.visitLabel(label0);
+            methodVisitor.visitLineNumber(71, label0);
+            methodVisitor.visitLdcInsn(Type.getType("Lnet/ranides/assira/reflection/adapter/example/InnerDefs$Record;"));
+            methodVisitor.visitMethodInsn(INVOKESTATIC, "net/ranides/assira/reflection/IClass", "typeinfo", "(Ljava/lang/Class;)Lnet/ranides/assira/reflection/IClass;", true);
+            methodVisitor.visitFieldInsn(PUTSTATIC, "net/ranides/assira/example/IRecord4Proxy", "I_CLASS", "Lnet/ranides/assira/reflection/IClass;");
+            Label label1 = new Label();
+            methodVisitor.visitLabel(label1);
+            methodVisitor.visitLineNumber(73, label1);
+            methodVisitor.visitFieldInsn(GETSTATIC, "net/ranides/assira/example/IRecord4Proxy", "I_CLASS", "Lnet/ranides/assira/reflection/IClass;");
+            methodVisitor.visitLdcInsn("args1");
+            methodVisitor.visitIntInsn(BIPUSH, 11);
+            methodVisitor.visitTypeInsn(ANEWARRAY, "java/lang/String");
+            methodVisitor.visitInsn(DUP);
+            methodVisitor.visitInsn(ICONST_0);
+            methodVisitor.visitLdcInsn("[I");
+            methodVisitor.visitInsn(AASTORE);
+            methodVisitor.visitInsn(DUP);
+            methodVisitor.visitInsn(ICONST_1);
+            methodVisitor.visitLdcInsn("[Ljava\\lang\\Float;");
+            methodVisitor.visitInsn(AASTORE);
+            methodVisitor.visitInsn(DUP);
+            methodVisitor.visitInsn(ICONST_2);
+            methodVisitor.visitLdcInsn("Ljava\\lang\\Number;");
+            methodVisitor.visitInsn(AASTORE);
+            methodVisitor.visitInsn(DUP);
+            methodVisitor.visitInsn(ICONST_3);
+            methodVisitor.visitLdcInsn("a");
+            methodVisitor.visitInsn(AASTORE);
+            methodVisitor.visitInsn(DUP);
+            methodVisitor.visitInsn(ICONST_4);
+            methodVisitor.visitLdcInsn("b");
+            methodVisitor.visitInsn(AASTORE);
+            methodVisitor.visitInsn(DUP);
+            methodVisitor.visitInsn(ICONST_5);
+            methodVisitor.visitLdcInsn("c");
+            methodVisitor.visitInsn(AASTORE);
+            methodVisitor.visitInsn(DUP);
+            methodVisitor.visitIntInsn(BIPUSH, 6);
+            methodVisitor.visitLdcInsn("d");
+            methodVisitor.visitInsn(AASTORE);
+            methodVisitor.visitInsn(DUP);
+            methodVisitor.visitIntInsn(BIPUSH, 7);
+            methodVisitor.visitLdcInsn("e");
+            methodVisitor.visitInsn(AASTORE);
+            methodVisitor.visitInsn(DUP);
+            methodVisitor.visitIntInsn(BIPUSH, 8);
+            methodVisitor.visitLdcInsn("f");
+            methodVisitor.visitInsn(AASTORE);
+            methodVisitor.visitInsn(DUP);
+            methodVisitor.visitIntInsn(BIPUSH, 9);
+            methodVisitor.visitLdcInsn("g");
+            methodVisitor.visitInsn(AASTORE);
+            methodVisitor.visitInsn(DUP);
+            methodVisitor.visitIntInsn(BIPUSH, 10);
+            methodVisitor.visitLdcInsn("h");
+            methodVisitor.visitInsn(AASTORE);
+            methodVisitor.visitMethodInsn(INVOKESTATIC, "net/ranides/assira/example/ExampleSupport", "link", "(Lnet/ranides/assira/reflection/IClass;Ljava/lang/String;[Ljava/lang/String;)Lnet/ranides/assira/reflection/IMethod;", false);
+            methodVisitor.visitFieldInsn(PUTSTATIC, "net/ranides/assira/example/IRecord4Proxy", "ARGS1", "Lnet/ranides/assira/reflection/IMethod;");
+            methodVisitor.visitInsn(RETURN);
+            methodVisitor.visitMaxs(6, 0);
+            methodVisitor.visitEnd();
+        }
         classWriter.visitEnd();
 
         return classWriter.toByteArray();