diff --git a/demo/java-demo/src/main/java/com/alibaba/demo/basic/model/omni/Child.java b/demo/java-demo/src/main/java/com/alibaba/demo/basic/model/omni/Child.java index c1331e3..6d7ce5f 100644 --- a/demo/java-demo/src/main/java/com/alibaba/demo/basic/model/omni/Child.java +++ b/demo/java-demo/src/main/java/com/alibaba/demo/basic/model/omni/Child.java @@ -15,6 +15,14 @@ public class Child { private InnerChild subChild; + /** + * 这是一个私有内部类 + * An private inner class + */ + private class InnerChild { + private String secret; + } + /* --------------------------------------- 以下Getters/Setters方法仅为便于功能演示而添加 并非OmniConstructor或OmniAccessor功能所需 @@ -36,12 +44,4 @@ public class Child { this.subChild = subChild; } - /** - * 这是一个私有内部类 - * An private inner class - */ - private class InnerChild { - private String secret; - } - } diff --git a/testable-core/src/main/java/com/alibaba/testable/core/tool/OmniConstructor.java b/testable-core/src/main/java/com/alibaba/testable/core/tool/OmniConstructor.java index 2db2fe1..131d8df 100644 --- a/testable-core/src/main/java/com/alibaba/testable/core/tool/OmniConstructor.java +++ b/testable-core/src/main/java/com/alibaba/testable/core/tool/OmniConstructor.java @@ -114,11 +114,11 @@ public class OmniConstructor { return array; } - private static T newAbstractClass(Class clazz) { - return null; + private static T newAbstractClass(Class clazz) throws InstantiationException { + return ConstructionUtil.generateSubClassOf(clazz); } - private static T newInterface(Class clazz) { + private static T newInterface(Class clazz) throws InstantiationException { if (clazz.equals(List.class)) { return (T)Collections.emptyList(); } else if (clazz.equals(Map.class)) { @@ -126,7 +126,7 @@ public class OmniConstructor { } else if (clazz.equals(Set.class)) { return (T)Collections.emptySet(); } - return null; + return ConstructionUtil.generateSubClassOf(clazz); } private static T newEnum(Class clazz) diff --git a/testable-core/src/main/java/com/alibaba/testable/core/util/ConstructionUtil.java b/testable-core/src/main/java/com/alibaba/testable/core/util/ConstructionUtil.java new file mode 100644 index 0000000..76dba86 --- /dev/null +++ b/testable-core/src/main/java/com/alibaba/testable/core/util/ConstructionUtil.java @@ -0,0 +1,35 @@ +package com.alibaba.testable.core.util; + +import com.alibaba.testable.core.compile.InMemoryJavaCompiler; + +import java.lang.reflect.Method; + +public class ConstructionUtil { + + private static final String TESTABLE_IMPL = "$TestableImpl"; + private static final String TESTABLE_OMNI_PKG = "com.alibaba.testable.omni"; + + public static T generateSubClassOf(Class clazz) throws InstantiationException { + StringBuilder sourceCode = new StringBuilder(); + sourceCode.append("package ").append(TESTABLE_OMNI_PKG).append(";\n") + .append("public class ").append(getSubclassName(clazz)) + .append(clazz.isInterface() ? " implements " : " extends ").append(clazz.getName()).append(" {\n"); + for (Method m : clazz.getMethods()) { + + } + sourceCode.append("}"); + + try { + Class helloClass = InMemoryJavaCompiler.newInstance() + .compile(TESTABLE_OMNI_PKG + "." + getSubclassName(clazz), sourceCode.toString()); + return (T) helloClass.newInstance(); + } catch (Exception e) { + throw new InstantiationException(e.toString()); + } + } + + private static String getSubclassName(Class clazz) { + return clazz.getName() + TESTABLE_IMPL; + } + +}