Bläddra i källkod

draft: adapter

Mariusz Sieroń 6 år sedan
förälder
incheckning
dccb94090f

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

@@ -11,8 +11,6 @@ import java.util.Set;
 
 public class Adapter {
 
-    private static final BCLoader LOADER = new BCLoader();
-
     private static final String FIELD_THAT = "that";
 
     public static <T> T cast(Class<T> type, Object that) {
@@ -45,9 +43,9 @@ public class Adapter {
             putMethod(writer, vmcDelegate, m);
         }
 
-        Class<?> clazz = LOADER.defineClass(adapterName, writer.bytecode());
+        IClass<?> clazz = writer.generate();
 
-        return type.cast(IClass.typeinfo(clazz).construct(that));
+        return type.cast(clazz.construct(that));
     }
 
     private static void putConstructor(IClassBuilder writer, IClass<?> delegate) {
@@ -103,12 +101,4 @@ public class Adapter {
         }
     }
 
-    private static class BCLoader extends ClassLoader {
-
-        public Class<?> defineClass(String name, byte[] b) {
-            return defineClass(name, b, 0, b.length);
-        }
-
-    }
-
 }

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

@@ -24,4 +24,6 @@ public interface IClassBuilder {
     IMethodBuilder method(IAttributes attrs, String name, Iterable<IClass<?>> params, IClass<?> ret, Iterable<IClass<?>> exceptions);
 
     byte[] bytecode();
+
+    IClass<?> generate();
 }

+ 16 - 0
assira.drafts/src/main/java/net/ranides/assira/reflection/asm/impl/CClassBuilder.java

@@ -60,4 +60,20 @@ public class CClassBuilder implements IClassBuilder {
         cv.visitEnd();
         return cv.toByteArray();
     }
+
+    @Override
+    public IClass<?> generate() {
+        Class<?> reflective = BCLoader.LOADER.defineClass(this.type.name(), bytecode());
+        return IClass.typeinfo(reflective);
+    }
+
+    private static class BCLoader extends ClassLoader {
+
+        private static final BCLoader LOADER = new BCLoader();
+
+        public Class<?> defineClass(String name, byte[] b) {
+            return defineClass(name, b, 0, b.length);
+        }
+
+    }
 }