mirror of
https://github.com/alibaba/testable-mock.git
synced 2026-08-19 09:43:29 +08:00
feat: support generate system interface class
This commit is contained in:
@@ -14,9 +14,10 @@ public class ConstructionUtil {
|
||||
|
||||
public static <T> T generateSubClassOf(Class<T> clazz) throws InstantiationException {
|
||||
StringBuilder sourceCode = new StringBuilder();
|
||||
String packageName = adaptName(clazz.getPackage().getName());
|
||||
Map<String, String> genericNames = getImplicitGenericParameters(clazz);
|
||||
sourceCode.append("package ")
|
||||
.append(clazz.getPackage().getName())
|
||||
.append(packageName)
|
||||
.append(";\npublic class ")
|
||||
.append(getSubclassName(clazz))
|
||||
.append(getTypeParameters(clazz.getTypeParameters(), true, genericNames))
|
||||
@@ -56,13 +57,18 @@ public class ConstructionUtil {
|
||||
.useParentClassLoader(clazz.getClassLoader())
|
||||
.useOptions("-Xlint:unchecked")
|
||||
.ignoreWarnings()
|
||||
.compile(clazz.getPackage().getName() + DOT + getSubclassName(clazz), sourceCode.toString())
|
||||
.compile(packageName + DOT + getSubclassName(clazz), sourceCode.toString())
|
||||
.newInstance();
|
||||
} catch (Exception e) {
|
||||
throw new InstantiationException(e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
private static String adaptName(String name) {
|
||||
// create class in 'java' package will cause 'prohibited package name' error
|
||||
return name.replaceAll("^java\\.", "testable.");
|
||||
}
|
||||
|
||||
private static <T> Map<String, String> getImplicitGenericParameters(Class<T> clazz) {
|
||||
Map<String, String> templateTypeMap = new HashMap<String, String>();
|
||||
List<Type> superTypes = new ArrayList<Type>(Arrays.asList(clazz.getGenericInterfaces()));
|
||||
|
||||
Reference in New Issue
Block a user