@GwtIncompatible(value="java.lang.reflect.*") public class CompilingClassLoader extends ClassLoader
String className = "com.foo.MyClass";
String classSource =
"package com.foo;\n" +
"public class MyClass implements Runnable {\n" +
" @Override public void run() {\n" +
" log(\"Hello world\");\n" +
" }\n" +
"}";
// Load class from source.
ClassLoader classLoader = new CompilingClassLoader(
parentClassLoader, className, classSource);
Class myClass = classLoader.loadClass(className);
// Use it.
Runnable instance = (Runnable)myClass.newInstance();
instance.run();
Only one chunk of source can be compiled per instance of CompilingClassLoader. If you need to
compile more, create multiple CompilingClassLoader instances.
Uses Java 1.6's in built compiler API.
If the class cannot be compiled, loadClass() will throw a ClassNotFoundException and log the
compile errors to System.err. If you don't want the messages logged, or want to explicitly handle
the messages you can provide your own DiagnosticListener through
{#setDiagnosticListener()}.ClassLoader,
JavaCompiler| Modifier and Type | Class and Description |
|---|---|
static class |
CompilingClassLoader.CompilerException
Thrown when code cannot be compiled.
|
| Constructor and Description |
|---|
CompilingClassLoader(ClassLoader parent,
String className,
String sourceCode,
DiagnosticListener<JavaFileObject> diagnosticListener) |
| Modifier and Type | Method and Description |
|---|---|
Class<?> |
findClass(String name)
Override ClassLoader's class resolving method.
|
clearAssertionStatus, defineClass, defineClass, defineClass, defineClass, definePackage, findLibrary, findLoadedClass, findResource, findResources, findSystemClass, getClassLoadingLock, getPackage, getPackages, getParent, getResource, getResourceAsStream, getResources, getSystemClassLoader, getSystemResource, getSystemResourceAsStream, getSystemResources, loadClass, loadClass, registerAsParallelCapable, resolveClass, setClassAssertionStatus, setDefaultAssertionStatus, setPackageAssertionStatus, setSignerspublic CompilingClassLoader(ClassLoader parent, String className, String sourceCode, DiagnosticListener<JavaFileObject> diagnosticListener) throws CompilingClassLoader.CompilerException
parent - Parent classloader to resolve dependencies from.className - Name of class to compile. eg. "com.foo.MyClass".sourceCode - Java source for class. e.g. "package com.foo; class MyClass { ... }".diagnosticListener - Notified of compiler errors (may be null).CompilingClassLoader.CompilerExceptionpublic Class<?> findClass(String name) throws ClassNotFoundException
ClassLoader.loadClass(String).findClass in class ClassLoaderClassNotFoundExceptionCopyright © 2016. All rights reserved.