11package org .mdkt .compiler ;
22
3- import java .util .*;
4-
53import javax .tools .*;
4+ import java .util .*;
65
76/**
87 * Compile Java sources in-memory
@@ -65,38 +64,62 @@ public InMemoryJavaCompiler ignoreWarnings() {
6564 * @throws Exception
6665 */
6766 public Map <String , Class <?>> compileAll () throws Exception {
67+ Map <String , byte []> compiled = compileAllToBytes ();
68+ return loadCompiledBytes (compiled );
69+ }
70+
71+ public Class <?> loadCompiledBytes (String className , byte [] compiledClasses ) throws ClassNotFoundException {
72+ Map <String , byte []> map = new HashMap <>();
73+ map .put (className , compiledClasses );
74+ return loadCompiledBytes (map ).get (className );
75+ }
76+
77+ public Map <String , Class <?>> loadCompiledBytes (Map <String , byte []> compiledClasses ) throws ClassNotFoundException {
78+ ClassLoader classLoader = new ClassLoader () {
79+ @ Override
80+ protected Class <?> findClass (String name ) {
81+ byte [] b = compiledClasses .get (name );
82+ return defineClass (name , b , 0 , b .length );
83+ }
84+ };
85+ Map <String , Class <?>> classes = new HashMap <>();
86+ for (String className : compiledClasses .keySet ()) {
87+ classes .put (className , classLoader .loadClass (className ));
88+ }
89+ return classes ;
90+ }
91+
92+ public Map <String , byte []> compileAllToBytes () throws Exception {
6893 if (sourceCodes .size () == 0 ) {
6994 throw new CompilationException ("No source code to compile" );
7095 }
7196 Collection <SourceCode > compilationUnits = sourceCodes .values ();
72- CompiledCode [] code ;
73-
74- code = new CompiledCode [compilationUnits .size ()];
97+ CompiledCode [] code = new CompiledCode [compilationUnits .size ()];
7598 Iterator <SourceCode > iter = compilationUnits .iterator ();
7699 for (int i = 0 ; i < code .length ; i ++) {
77100 code [i ] = new CompiledCode (iter .next ().getClassName ());
78101 }
79102 DiagnosticCollector <JavaFileObject > collector = new DiagnosticCollector <>();
80- ExtendedStandardJavaFileManager fileManager = new ExtendedStandardJavaFileManager (javac .getStandardFileManager (null , null , null ), classLoader );
103+ ExtendedStandardJavaFileManager fileManager = new ExtendedStandardJavaFileManager (javac .getStandardFileManager (null , null , null ), classLoader , code );
81104 JavaCompiler .CompilationTask task = javac .getTask (null , fileManager , collector , options , null , compilationUnits );
82105 boolean result = task .call ();
83106 if (!result || collector .getDiagnostics ().size () > 0 ) {
84- StringBuffer exceptionMsg = new StringBuffer ();
107+ StringBuilder exceptionMsg = new StringBuilder ();
85108 exceptionMsg .append ("Unable to compile the source" );
86109 boolean hasWarnings = false ;
87110 boolean hasErrors = false ;
88111 for (Diagnostic <? extends JavaFileObject > d : collector .getDiagnostics ()) {
89112 switch (d .getKind ()) {
90- case NOTE :
91- case MANDATORY_WARNING :
92- case WARNING :
93- hasWarnings = true ;
94- break ;
95- case OTHER :
96- case ERROR :
97- default :
98- hasErrors = true ;
99- break ;
113+ case NOTE :
114+ case MANDATORY_WARNING :
115+ case WARNING :
116+ hasWarnings = true ;
117+ break ;
118+ case OTHER :
119+ case ERROR :
120+ default :
121+ hasErrors = true ;
122+ break ;
100123 }
101124 exceptionMsg .append ("\n " ).append ("[kind=" ).append (d .getKind ());
102125 exceptionMsg .append (", " ).append ("line=" ).append (d .getLineNumber ());
@@ -107,9 +130,9 @@ public Map<String, Class<?>> compileAll() throws Exception {
107130 }
108131 }
109132
110- Map <String , Class <?>> classes = new HashMap <String , Class <?> >();
111- for (String className : sourceCodes . keySet () ) {
112- classes .put (className , classLoader . loadClass ( className ));
133+ Map <String , byte []> classes = new HashMap <>();
134+ for (CompiledCode aCode : code ) {
135+ classes .put (aCode . getClassName (), aCode . getByteCode ( ));
113136 }
114137 return classes ;
115138 }
@@ -139,4 +162,6 @@ public InMemoryJavaCompiler addSource(String className, String sourceCode) throw
139162 sourceCodes .put (className , new SourceCode (className , sourceCode ));
140163 return this ;
141164 }
165+
166+
142167}
0 commit comments