From 632a754948d6d365493271fcc3ffd330c5ee6ec7 Mon Sep 17 00:00:00 2001 From: wanghbxxxx Date: Sat, 2 Feb 2019 15:39:43 +0800 Subject: [PATCH 1/6] refactor JavassistCompiler --- .../common/compiler/support/ClassUtils.java | 8 + .../compiler/support/JavassistClassInfo.java | 160 ++++++++++++++++++ .../compiler/support/JavassistCompiler.java | 97 ++++------- .../compiler/support/ClassUtilsTest.java | 6 + 4 files changed, 205 insertions(+), 66 deletions(-) create mode 100644 dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/ClassUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/ClassUtils.java index 5d3cdad041d..da50cc0f907 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/ClassUtils.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/ClassUtils.java @@ -431,5 +431,13 @@ public static Map toMap(Map.Entry[] entries) { } return map; } + + /** + * get classname from qualified name + */ + public static String getSimpleClassName(String qualifiedName) { + int i = qualifiedName.lastIndexOf('.'); + return i < 0 ? qualifiedName : qualifiedName.substring(i + 1); + } } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java new file mode 100644 index 00000000000..16b2b975d6d --- /dev/null +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java @@ -0,0 +1,160 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.dubbo.common.compiler.support; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javassist.CannotCompileException; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtField; +import javassist.CtNewConstructor; +import javassist.CtNewMethod; +import javassist.NotFoundException; + +/** + * Javassist class info contains all the information used for JavassistCompiler, including: + *

+ * class name, imported packages, super class name, implemented interfaces, constructors, fields, methods. + */ +public class JavassistClassInfo { + + private String className; + + private String superClassName = "java.lang.Object"; + + private List imports = new ArrayList<>(); + + private Map fullNames = new HashMap<>(); + + private List ifaces = new ArrayList<>(); + + private List constructors = new ArrayList<>(); + + private List fields = new ArrayList<>(); + + private List methods = new ArrayList<>(); + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public String getSuperClassName() { + return superClassName; + } + + public void setSuperClassName(String superClassName) { + this.superClassName = getQualifiedClassName(superClassName); + } + + public List getImports() { + return imports; + } + + public void addImports(String pkg) { + int pi = pkg.lastIndexOf('.'); + if (pi > 0) { + String pkgName = pkg.substring(0, pi); + this.imports.add(pkgName); + if (!pkg.endsWith(".*")) { + fullNames.put(pkg.substring(pi + 1), pkg); + } + } + } + + public List getInterfaces() { + return ifaces; + } + + public void addInterface(String iface) { + this.ifaces.add(getQualifiedClassName(iface)); + } + + public List getConstructors() { + return constructors; + } + + public void addConstructor(String constructor) { + this.constructors.add(constructor); + } + + public List getFields() { + return fields; + } + + public void addField(String field) { + this.fields.add(field); + } + + public List getMethods() { + return methods; + } + + public void addMethod(String method) { + this.methods.add(method); + } + + /** + * get full qualified class name + * + * @param className super class name, maybe qualified or not + */ + protected String getQualifiedClassName(String className) { + if (className.contains(".")) { + return className; + } + + if (fullNames.containsKey(className)) { + return fullNames.get(className); + } + + return ClassUtils.forName(imports.toArray(new String[0]), className).getName(); + } + + /** + * build CtClass object + */ + public CtClass build(ClassPool context) throws NotFoundException, CannotCompileException { + CtClass ctClass = context.makeClass(className, context.get(superClassName)); + imports.stream().forEach(context::importPackage); + for (String iface: ifaces) { + ctClass.addInterface(context.get(iface)); + } + + for (String iface: constructors) { + ctClass.addConstructor(CtNewConstructor.make("public " + iface, ctClass)); + } + + for (String iface: fields) { + ctClass.addField(CtField.make("private " + iface, ctClass)); + } + + for (String iface: methods) { + ctClass.addMethod(CtNewMethod.make("public " + iface, ctClass)); + } + + return ctClass; + } + +} diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java index 5beb8e4ad9d..45de71449cd 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java @@ -20,15 +20,9 @@ import javassist.ClassPool; import javassist.CtClass; -import javassist.CtField; -import javassist.CtNewConstructor; -import javassist.CtNewMethod; import javassist.LoaderClassPath; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -49,77 +43,48 @@ public class JavassistCompiler extends AbstractCompiler { @Override public Class doCompile(String name, String source) throws Throwable { - int i = name.lastIndexOf('.'); - String className = i < 0 ? name : name.substring(i + 1); - ClassPool pool = new ClassPool(true); - pool.appendClassPath(new LoaderClassPath(ClassHelper.getCallerClassLoader(getClass()))); + JavassistClassInfo info = new JavassistClassInfo(); + info.setClassName(name); + + // process imported classes Matcher matcher = IMPORT_PATTERN.matcher(source); - List importPackages = new ArrayList(); - Map fullNames = new HashMap(); while (matcher.find()) { - String pkg = matcher.group(1); - if (pkg.endsWith(".*")) { - String pkgName = pkg.substring(0, pkg.length() - 2); - pool.importPackage(pkgName); - importPackages.add(pkgName); - } else { - int pi = pkg.lastIndexOf('.'); - if (pi > 0) { - String pkgName = pkg.substring(0, pi); - pool.importPackage(pkgName); - importPackages.add(pkgName); - fullNames.put(pkg.substring(pi + 1), pkg); - } - } + info.addImports(matcher.group(1).trim()); } - String[] packages = importPackages.toArray(new String[0]); + + // process extended super class matcher = EXTENDS_PATTERN.matcher(source); - CtClass cls; if (matcher.find()) { - String extend = matcher.group(1).trim(); - String extendClass; - if (extend.contains(".")) { - extendClass = extend; - } else if (fullNames.containsKey(extend)) { - extendClass = fullNames.get(extend); - } else { - extendClass = ClassUtils.forName(packages, extend).getName(); - } - cls = pool.makeClass(name, pool.get(extendClass)); - } else { - cls = pool.makeClass(name); + info.setSuperClassName(matcher.group(1).trim()); } + + // process implemented interfaces matcher = IMPLEMENTS_PATTERN.matcher(source); if (matcher.find()) { String[] ifaces = matcher.group(1).trim().split("\\,"); - for (String iface : ifaces) { - iface = iface.trim(); - String ifaceClass; - if (iface.contains(".")) { - ifaceClass = iface; - } else if (fullNames.containsKey(iface)) { - ifaceClass = fullNames.get(iface); - } else { - ifaceClass = ClassUtils.forName(packages, iface).getName(); - } - cls.addInterface(pool.get(ifaceClass)); - } + Arrays.stream(ifaces).forEach(i -> info.addInterface(i.trim())); } - String body = source.substring(source.indexOf("{") + 1, source.length() - 1); + + // process constructors, fields, methods + String body = source.substring(source.indexOf('{') + 1, source.length() - 1); String[] methods = METHODS_PATTERN.split(body); - for (String method : methods) { - method = method.trim(); - if (method.length() > 0) { - if (method.startsWith(className)) { - cls.addConstructor(CtNewConstructor.make("public " + method, cls)); - } else if (FIELD_PATTERN.matcher(method).matches()) { - cls.addField(CtField.make("private " + method, cls)); - } else { - cls.addMethod(CtNewMethod.make("public " + method, cls)); - } + String className = ClassUtils.getSimpleClassName(name); + Arrays.stream(methods).map(String::trim).filter(m -> !m.isEmpty()).forEach(method-> { + if (method.startsWith(className)) { + info.addConstructor(method); + } else if (FIELD_PATTERN.matcher(method).matches()) { + info.addField(method); + } else { + info.addMethod(method); } - } - return cls.toClass(ClassHelper.getCallerClassLoader(getClass()), JavassistCompiler.class.getProtectionDomain()); + }); + + // compile + ClassLoader classLoader = ClassHelper.getCallerClassLoader(getClass()); + ClassPool pool = new ClassPool(true); + pool.appendClassPath(new LoaderClassPath(classLoader)); + CtClass cls = info.build(pool); + return cls.toClass(classLoader, JavassistCompiler.class.getProtectionDomain()); } } diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/ClassUtilsTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/ClassUtilsTest.java index 2ebf66880ca..2c9281a3179 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/ClassUtilsTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/ClassUtilsTest.java @@ -146,6 +146,12 @@ public void testGetGenericClass() { public void testGetSizeMethod() { Assertions.assertEquals("getLength()", ClassUtils.getSizeMethod(GenericClass3.class)); } + + @Test + public void testGetSimpleClassName() { + Assertions.assertEquals("Map", ClassUtils.getSimpleClassName(Map.class.getName())); + Assertions.assertEquals("Map", ClassUtils.getSimpleClassName(Map.class.getSimpleName())); + } private interface GenericInterface { } From 850248e1aa3f3f906c7c46a9a212360aa9fefd06 Mon Sep 17 00:00:00 2001 From: wanghbxxxx Date: Sat, 2 Feb 2019 15:42:43 +0800 Subject: [PATCH 2/6] rename variable names --- .../common/compiler/support/JavassistClassInfo.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java index 16b2b975d6d..786d39978fd 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java @@ -142,16 +142,16 @@ public CtClass build(ClassPool context) throws NotFoundException, CannotCompileE ctClass.addInterface(context.get(iface)); } - for (String iface: constructors) { - ctClass.addConstructor(CtNewConstructor.make("public " + iface, ctClass)); + for (String constructor: constructors) { + ctClass.addConstructor(CtNewConstructor.make("public " + constructor, ctClass)); } - for (String iface: fields) { - ctClass.addField(CtField.make("private " + iface, ctClass)); + for (String field: fields) { + ctClass.addField(CtField.make("private " + field, ctClass)); } - for (String iface: methods) { - ctClass.addMethod(CtNewMethod.make("public " + iface, ctClass)); + for (String method: methods) { + ctClass.addMethod(CtNewMethod.make("public " + method, ctClass)); } return ctClass; From 1f4e34bf8dec01805ddda39003aecf11cf321213 Mon Sep 17 00:00:00 2001 From: wanghbxxxx Date: Sat, 2 Feb 2019 22:33:50 +0800 Subject: [PATCH 3/6] reformat code --- .../compiler/support/JavassistClassInfo.java | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java index 786d39978fd..30ca4e7ca94 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java @@ -35,21 +35,21 @@ * class name, imported packages, super class name, implemented interfaces, constructors, fields, methods. */ public class JavassistClassInfo { - + private String className; - + private String superClassName = "java.lang.Object"; private List imports = new ArrayList<>(); - + private Map fullNames = new HashMap<>(); - + private List ifaces = new ArrayList<>(); - + private List constructors = new ArrayList<>(); - + private List fields = new ArrayList<>(); - + private List methods = new ArrayList<>(); public String getClassName() { @@ -94,7 +94,7 @@ public void addInterface(String iface) { public List getConstructors() { return constructors; } - + public void addConstructor(String constructor) { this.constructors.add(constructor); } @@ -102,7 +102,7 @@ public void addConstructor(String constructor) { public List getFields() { return fields; } - + public void addField(String field) { this.fields.add(field); } @@ -110,7 +110,7 @@ public void addField(String field) { public List getMethods() { return methods; } - + public void addMethod(String method) { this.methods.add(method); } @@ -123,37 +123,37 @@ public void addMethod(String method) { protected String getQualifiedClassName(String className) { if (className.contains(".")) { return className; - } - + } + if (fullNames.containsKey(className)) { return fullNames.get(className); - } + } return ClassUtils.forName(imports.toArray(new String[0]), className).getName(); } - + /** * build CtClass object */ public CtClass build(ClassPool context) throws NotFoundException, CannotCompileException { CtClass ctClass = context.makeClass(className, context.get(superClassName)); imports.stream().forEach(context::importPackage); - for (String iface: ifaces) { + for (String iface : ifaces) { ctClass.addInterface(context.get(iface)); } - - for (String constructor: constructors) { + + for (String constructor : constructors) { ctClass.addConstructor(CtNewConstructor.make("public " + constructor, ctClass)); } - - for (String field: fields) { + + for (String field : fields) { ctClass.addField(CtField.make("private " + field, ctClass)); } - - for (String method: methods) { + + for (String method : methods) { ctClass.addMethod(CtNewMethod.make("public " + method, ctClass)); } - + return ctClass; } From 7102eea9b5f37380054d3359fe8b6f1e592a2b3d Mon Sep 17 00:00:00 2001 From: wanghbxxxx Date: Sun, 3 Feb 2019 09:33:01 +0800 Subject: [PATCH 4/6] refactor: prepend modifier of constructor, field and method outside the JavassistClassInfo --- .../compiler/support/JavassistClassInfo.java | 26 ++++++++++++++----- .../compiler/support/JavassistCompiler.java | 12 +++------ 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java index 30ca4e7ca94..2041d2330d1 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java @@ -27,6 +27,7 @@ import javassist.CtField; import javassist.CtNewConstructor; import javassist.CtNewMethod; +import javassist.LoaderClassPath; import javassist.NotFoundException; /** @@ -135,23 +136,34 @@ protected String getQualifiedClassName(String className) { /** * build CtClass object */ - public CtClass build(ClassPool context) throws NotFoundException, CannotCompileException { - CtClass ctClass = context.makeClass(className, context.get(superClassName)); - imports.stream().forEach(context::importPackage); + public CtClass build(ClassLoader classLoader) throws NotFoundException, CannotCompileException { + ClassPool pool = new ClassPool(true); + pool.appendClassPath(new LoaderClassPath(classLoader)); + + // create class + CtClass ctClass = pool.makeClass(className, pool.get(superClassName)); + + // add imported packages + imports.stream().forEach(pool::importPackage); + + // add implemented interfaces for (String iface : ifaces) { - ctClass.addInterface(context.get(iface)); + ctClass.addInterface(pool.get(iface)); } + // add constructors for (String constructor : constructors) { - ctClass.addConstructor(CtNewConstructor.make("public " + constructor, ctClass)); + ctClass.addConstructor(CtNewConstructor.make(constructor, ctClass)); } + // add fields for (String field : fields) { - ctClass.addField(CtField.make("private " + field, ctClass)); + ctClass.addField(CtField.make(field, ctClass)); } + // add methods for (String method : methods) { - ctClass.addMethod(CtNewMethod.make("public " + method, ctClass)); + ctClass.addMethod(CtNewMethod.make(method, ctClass)); } return ctClass; diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java index 45de71449cd..15ca1b1c3c5 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java @@ -18,9 +18,7 @@ import org.apache.dubbo.common.utils.ClassHelper; -import javassist.ClassPool; import javassist.CtClass; -import javassist.LoaderClassPath; import java.util.Arrays; import java.util.regex.Matcher; @@ -71,19 +69,17 @@ public Class doCompile(String name, String source) throws Throwable { String className = ClassUtils.getSimpleClassName(name); Arrays.stream(methods).map(String::trim).filter(m -> !m.isEmpty()).forEach(method-> { if (method.startsWith(className)) { - info.addConstructor(method); + info.addConstructor("public " + method); } else if (FIELD_PATTERN.matcher(method).matches()) { - info.addField(method); + info.addField("private " + method); } else { - info.addMethod(method); + info.addMethod("public " + method); } }); // compile ClassLoader classLoader = ClassHelper.getCallerClassLoader(getClass()); - ClassPool pool = new ClassPool(true); - pool.appendClassPath(new LoaderClassPath(classLoader)); - CtClass cls = info.build(pool); + CtClass cls = info.build(classLoader); return cls.toClass(classLoader, JavassistCompiler.class.getProtectionDomain()); } From 13a3038c20a08d2a7249786dbd3a10de59c1e7db Mon Sep 17 00:00:00 2001 From: wanghbxxxx Date: Sun, 3 Feb 2019 14:55:58 +0800 Subject: [PATCH 5/6] add null for ClassUtils.getSimpleClassName --- .../apache/dubbo/common/compiler/support/ClassUtils.java | 6 +++++- .../dubbo/common/compiler/support/ClassUtilsTest.java | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/ClassUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/ClassUtils.java index da50cc0f907..365cb7f36db 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/ClassUtils.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/ClassUtils.java @@ -433,9 +433,13 @@ public static Map toMap(Map.Entry[] entries) { } /** - * get classname from qualified name + * get simple class name from qualified class name */ public static String getSimpleClassName(String qualifiedName) { + if (null == qualifiedName) { + return null; + } + int i = qualifiedName.lastIndexOf('.'); return i < 0 ? qualifiedName : qualifiedName.substring(i + 1); } diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/ClassUtilsTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/ClassUtilsTest.java index 2c9281a3179..8acf00bfeef 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/ClassUtilsTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/ClassUtilsTest.java @@ -149,6 +149,7 @@ public void testGetSizeMethod() { @Test public void testGetSimpleClassName() { + Assertions.assertNull(ClassUtils.getSimpleClassName(null)); Assertions.assertEquals("Map", ClassUtils.getSimpleClassName(Map.class.getName())); Assertions.assertEquals("Map", ClassUtils.getSimpleClassName(Map.class.getSimpleName())); } From b744dcafa6836769bc17dc7f35eafc94db1b4a17 Mon Sep 17 00:00:00 2001 From: wanghbxxxx Date: Fri, 8 Feb 2019 15:58:07 +0800 Subject: [PATCH 6/6] rename JavassistClassInfo to CtClassBuilder --- ...ssistClassInfo.java => CtClassBuilder.java} | 6 ++++-- .../compiler/support/JavassistCompiler.java | 18 +++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) rename dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/{JavassistClassInfo.java => CtClassBuilder.java} (94%) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/CtClassBuilder.java similarity index 94% rename from dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java rename to dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/CtClassBuilder.java index 2041d2330d1..0dc8f881385 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistClassInfo.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/CtClassBuilder.java @@ -31,11 +31,13 @@ import javassist.NotFoundException; /** - * Javassist class info contains all the information used for JavassistCompiler, including: + * CtClassBuilder is builder for CtClass + *

+ * contains all the information, including: *

* class name, imported packages, super class name, implemented interfaces, constructors, fields, methods. */ -public class JavassistClassInfo { +public class CtClassBuilder { private String className; diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java index 15ca1b1c3c5..11f76b1e6bd 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java @@ -41,26 +41,26 @@ public class JavassistCompiler extends AbstractCompiler { @Override public Class doCompile(String name, String source) throws Throwable { - JavassistClassInfo info = new JavassistClassInfo(); - info.setClassName(name); + CtClassBuilder builder = new CtClassBuilder(); + builder.setClassName(name); // process imported classes Matcher matcher = IMPORT_PATTERN.matcher(source); while (matcher.find()) { - info.addImports(matcher.group(1).trim()); + builder.addImports(matcher.group(1).trim()); } // process extended super class matcher = EXTENDS_PATTERN.matcher(source); if (matcher.find()) { - info.setSuperClassName(matcher.group(1).trim()); + builder.setSuperClassName(matcher.group(1).trim()); } // process implemented interfaces matcher = IMPLEMENTS_PATTERN.matcher(source); if (matcher.find()) { String[] ifaces = matcher.group(1).trim().split("\\,"); - Arrays.stream(ifaces).forEach(i -> info.addInterface(i.trim())); + Arrays.stream(ifaces).forEach(i -> builder.addInterface(i.trim())); } // process constructors, fields, methods @@ -69,17 +69,17 @@ public Class doCompile(String name, String source) throws Throwable { String className = ClassUtils.getSimpleClassName(name); Arrays.stream(methods).map(String::trim).filter(m -> !m.isEmpty()).forEach(method-> { if (method.startsWith(className)) { - info.addConstructor("public " + method); + builder.addConstructor("public " + method); } else if (FIELD_PATTERN.matcher(method).matches()) { - info.addField("private " + method); + builder.addField("private " + method); } else { - info.addMethod("public " + method); + builder.addMethod("public " + method); } }); // compile ClassLoader classLoader = ClassHelper.getCallerClassLoader(getClass()); - CtClass cls = info.build(classLoader); + CtClass cls = builder.build(classLoader); return cls.toClass(classLoader, JavassistCompiler.class.getProtectionDomain()); }