feat: generate empty sub class for interface

This commit is contained in:
金戟
2022-06-04 23:11:12 +08:00
parent 3c11676408
commit ef6099a63d
3 changed files with 47 additions and 12 deletions

View File

@@ -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;
}
}

View File

@@ -114,11 +114,11 @@ public class OmniConstructor {
return array;
}
private static <T> T newAbstractClass(Class<T> clazz) {
return null;
private static <T> T newAbstractClass(Class<T> clazz) throws InstantiationException {
return ConstructionUtil.generateSubClassOf(clazz);
}
private static <T> T newInterface(Class<T> clazz) {
private static <T> T newInterface(Class<T> 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> T newEnum(Class<T> clazz)

View File

@@ -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> T generateSubClassOf(Class<T> 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;
}
}