/** * Copyright 2011-2015 John Ericksen * * Licensed 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.parceler.internal; import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; import javax.tools.ToolProvider; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; /** * @author John Ericksen */ public class MemoryClassLoader extends ClassLoader { private final JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); private final MemoryFileManager manager = new MemoryFileManager(this.compiler); public MemoryClassLoader(){ //default ClassLoader backing super(MemoryClassLoader.class.getClassLoader()); } public void add(String classname, String fileContent) { add(Collections.singletonMap(classname, fileContent)); } public void add(Map<String, String> map) { List<Source> list = new ArrayList<Source>(); for (Map.Entry<String, String> entry : map.entrySet()) { list.add(new Source(entry.getKey(), JavaFileObject.Kind.SOURCE, entry.getValue())); } this.compiler.getTask(null, this.manager, null, null, null, list).call(); } @Override protected Class<?> findClass(String name) throws ClassNotFoundException { synchronized (this.manager) { Output mc = this.manager.map.remove(name); if (mc != null) { byte[] array = mc.toByteArray(); return defineClass(name, array, 0, array.length); } } return super.findClass(name); } }