From f42f462a9eae640e6c36f85f1b457ce66ba3a830 Mon Sep 17 00:00:00 2001 From: aoshiguchen <1052045476@qq.com> Date: Fri, 26 Aug 2022 13:19:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/aop/compiler/AsgcCompiler.java | 55 ++++++++++++++++--- .../core/aop/compiler/DynamicClassLoader.java | 6 +- .../aop/compiler/DynamicJavaFileManager.java | 2 +- .../aop/compiler/PackageInternalsFinder.java | 2 + .../core/aop/compiler/AsgcCompilerTest.java | 14 ++--- 5 files changed, 60 insertions(+), 19 deletions(-) diff --git a/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/compiler/AsgcCompiler.java b/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/compiler/AsgcCompiler.java index 7ac63cef..9ae41dff 100644 --- a/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/compiler/AsgcCompiler.java +++ b/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/compiler/AsgcCompiler.java @@ -22,7 +22,6 @@ package fun.asgc.neutrino.core.aop.compiler; import com.google.common.collect.Lists; -import com.sun.tools.javac.resources.compiler; import fun.asgc.neutrino.core.base.GlobalConfig; import fun.asgc.neutrino.core.util.CollectionUtil; import lombok.extern.slf4j.Slf4j; @@ -51,6 +50,9 @@ public class AsgcCompiler { private String generatorCodeSavePath; private DynamicClassLoader dynamicClassLoader; + private final List> errors = new ArrayList>(); + private final List> warnings = new ArrayList>(); + public AsgcCompiler() { this(ClassLoader.getSystemClassLoader()); } @@ -117,17 +119,54 @@ public class AsgcCompiler { * @param className 类名 * @param sourceCode 源代码 */ - public Class compile(String className, String sourceCode) throws ClassNotFoundException { + public Class compile(String pkg, String className, String sourceCode) throws ClassNotFoundException { + log.info("options:" + getOptions()); JavaFileManager javaFileManager = new DynamicJavaFileManager(standardJavaFileManager, dynamicClassLoader); Boolean result = javaCompiler.getTask(null, javaFileManager, collector, getOptions(), null, Lists.newArrayList(new StringSource(className, sourceCode))).call(); - if (!result) { - collector.getDiagnostics().forEach(item -> log.error(item.toString())); + if (!result || collector.getDiagnostics().size() > 0) { +// collector.getDiagnostics().forEach(item -> log.error(item.toString())); + if (!result || collector.getDiagnostics().size() > 0) { + for (Diagnostic diagnostic : collector.getDiagnostics()) { + switch (diagnostic.getKind()) { + case NOTE: + case MANDATORY_WARNING: + case WARNING: + warnings.add(diagnostic); + break; + case OTHER: + case ERROR: + default: + errors.add(diagnostic); + break; + } + } + + log.error("warring: {}", getWarnings()); + log.error("error: {}", getErrors()); + } } - Map> map = dynamicClassLoader.getClasses(); - if (CollectionUtil.isEmpty(map)) { - return null; + return dynamicClassLoader.findClass(pkg + "." + className); + } + + private List diagnosticToString(List> diagnostics) { + + List diagnosticMessages = new ArrayList(); + + for (Diagnostic diagnostic : diagnostics) { + diagnosticMessages.add( + "line: " + diagnostic.getLineNumber() + ", message: " + diagnostic.getMessage(Locale.US)); } - return map.values().stream().filter(c -> c.getSimpleName().equals(className)).findFirst().orElseGet(null); + + return diagnosticMessages; + + } + + public List getErrors() { + return diagnosticToString(errors); + } + + public List getWarnings() { + return diagnosticToString(warnings); } } diff --git a/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/compiler/DynamicClassLoader.java b/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/compiler/DynamicClassLoader.java index 07db14b4..56ba27db 100644 --- a/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/compiler/DynamicClassLoader.java +++ b/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/compiler/DynamicClassLoader.java @@ -43,7 +43,7 @@ public class DynamicClassLoader extends ClassLoader { @Override protected Class findClass(String name) throws ClassNotFoundException { MemoryByteCode byteCode = byteCodes.get(name); - if (byteCode == null) { + if (null == byteCode) { return super.findClass(name); } @@ -51,7 +51,7 @@ public class DynamicClassLoader extends ClassLoader { } public Map> getClasses() throws ClassNotFoundException { - Map> classes = new HashMap>(); + Map> classes = new HashMap<>(); for (MemoryByteCode byteCode : byteCodes.values()) { classes.put(byteCode.getClassName(), findClass(byteCode.getClassName())); } @@ -59,7 +59,7 @@ public class DynamicClassLoader extends ClassLoader { } public Map getByteCodes() { - Map result = new HashMap(byteCodes.size()); + Map result = new HashMap<>(byteCodes.size()); for (Map.Entry entry : byteCodes.entrySet()) { result.put(entry.getKey(), entry.getValue().getByteCode()); } diff --git a/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/compiler/DynamicJavaFileManager.java b/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/compiler/DynamicJavaFileManager.java index 6d906cb7..836cce2d 100644 --- a/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/compiler/DynamicJavaFileManager.java +++ b/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/compiler/DynamicJavaFileManager.java @@ -92,7 +92,7 @@ public class DynamicJavaFileManager extends ForwardingJavaFileManager(super.list(location, packageName, kinds, recurse), + return new IterableJoin<>(super.list(location, packageName, kinds, recurse), finder.find(packageName)); } diff --git a/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/compiler/PackageInternalsFinder.java b/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/compiler/PackageInternalsFinder.java index 50723908..b4e95e03 100644 --- a/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/compiler/PackageInternalsFinder.java +++ b/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/compiler/PackageInternalsFinder.java @@ -21,6 +21,8 @@ */ package fun.asgc.neutrino.core.aop.compiler; +import fun.asgc.neutrino.core.util.CollectionUtil; + import javax.tools.JavaFileObject; import java.io.File; import java.io.IOException; diff --git a/neutrino-core/src/test/java/fun/asgc/neutrino/core/aop/compiler/AsgcCompilerTest.java b/neutrino-core/src/test/java/fun/asgc/neutrino/core/aop/compiler/AsgcCompilerTest.java index b9b36d17..553ff9b2 100644 --- a/neutrino-core/src/test/java/fun/asgc/neutrino/core/aop/compiler/AsgcCompilerTest.java +++ b/neutrino-core/src/test/java/fun/asgc/neutrino/core/aop/compiler/AsgcCompilerTest.java @@ -43,7 +43,7 @@ public class AsgcCompilerTest { "\t\tSystem.out.println(\"hello\");\n" + "\t}\n" + "}\n"; - Class clazz = compiler.compile("Hello", code); + Class clazz = compiler.compile("a.b","Hello", code); Method method = ReflectUtil.getMethods(clazz).stream().filter(m -> m.getName().equals("hello")).findFirst().get(); Object instance = clazz.newInstance(); method.invoke(instance); @@ -59,7 +59,7 @@ public class AsgcCompilerTest { "\t\tSystem.out.println(\"熊猫正在吃\" + food);\n" + "\t}\n" + "}\n"; - Class clazz = compiler.compile("Panda", code); + Class clazz = compiler.compile("a.b","Panda", code); Method method = ReflectUtil.getMethods(clazz).stream().filter(m -> m.getName().equals("eat")).findFirst().get(); Object instance = clazz.newInstance(); method.invoke(instance, "竹子"); @@ -70,13 +70,13 @@ public class AsgcCompilerTest { AsgcCompiler compiler = new AsgcCompiler(); compiler.addClasspath("/Users/yangwen/my/tmp/java"); String code = "package a.b;\n" + - "import fun.asgc.Player;\n" + + "import fun.asgc.cptest.Player;\n" + "public class RadioPlayer implements Player {\n" + "\tpublic void play() {\n" + "\t\tSystem.out.println(\"收音机播放\");\n" + "\t}\n" + "}\n"; - Class clazz = compiler.compile("RadioPlayer", code); + Class clazz = compiler.compile("a.b","RadioPlayer", code); Method method = ReflectUtil.getMethods(clazz).stream().filter(m -> m.getName().equals("play")).findFirst().get(); Object instance = clazz.newInstance(); method.invoke(instance); @@ -89,7 +89,7 @@ public class AsgcCompilerTest { compiler.addClasspath("/Users/yangwen/my/tmp/java/asgc-package-lab1-1.0-SNAPSHOT.jar"); String code = "package a.b;\n" + "import fun.asgc.lab.pkg.lab1.Dog1;\n" + - "import fun.asgc.Player;\n" + + "import fun.asgc.cptest.Player;\n" + "public class RadioPlayer implements Player {\n" + "\tpublic void play() {\n" + // "\t\tSystem.out.println(Dog.class);\n" + @@ -97,7 +97,7 @@ public class AsgcCompilerTest { "\t\tSystem.out.println(\"收音机播放\");\n" + "\t}\n" + "}\n"; - Class clazz = compiler.compile("RadioPlayer", code); + Class clazz = compiler.compile("a.b","RadioPlayer", code); Method method = ReflectUtil.getMethods(clazz).stream().filter(m -> m.getName().equals("play")).findFirst().get(); Object instance = clazz.newInstance(); method.invoke(instance); @@ -113,7 +113,7 @@ public class AsgcCompilerTest { "}\n"; AsgcCompiler compiler = new AsgcCompiler(); try { - Class clazz = compiler.compile( "Calc", code); + Class clazz = compiler.compile( "fun.asgc.test","Calc", code); Method method = ReflectUtil.getMethods(clazz).stream().filter(m -> m.getName().equals("invoke")).findFirst().get(); return method.invoke(null); } catch (ClassNotFoundException|IllegalAccessException|InvocationTargetException e) {