Created
March 2, 2013 19:21
-
-
Save bonifaido/5072720 to your computer and use it in GitHub Desktop.
An isolated class loader after http://blog.markturansky.com/archives/21
Usage:
javac IsolatedClassLoader.java && java -ea IsolatedClassLoader
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.File; | |
import java.net.MalformedURLException; | |
import java.net.URL; | |
import java.net.URLClassLoader; | |
import java.util.ArrayList; | |
import java.util.List; | |
public class IsolatedClassLoader extends URLClassLoader { | |
private static URL[] classPathAsURLArray() { | |
List<URL> classPathUrls = new ArrayList<>(); | |
String classpath = System.getProperty("java.class.path"); | |
try { | |
for (String s : classpath.split(";")) { | |
classPathUrls.add(new File(s).toURI().toURL()); | |
} | |
} catch (MalformedURLException ex) { | |
} | |
return classPathUrls.toArray(new URL[classPathUrls.size()]); | |
} | |
private final String[] isolatedPackages; | |
public IsolatedClassLoader(String... isolatedPackages) { | |
super(classPathAsURLArray(), ClassLoader.getSystemClassLoader().getParent()); | |
this.isolatedPackages = isolatedPackages; | |
} | |
@Override | |
public Class<?> loadClass(String name) throws ClassNotFoundException { | |
if (isInIsolatedPackage(name)) { | |
return super.loadClass(name); | |
} else { | |
return ClassLoader.getSystemClassLoader().loadClass(name); | |
} | |
} | |
private boolean isInIsolatedPackage(String name) { | |
for (String p : isolatedPackages) { | |
if (name.contains(p)) { | |
return true; | |
} | |
} | |
return false; | |
} | |
public static void main(String... args) throws ClassNotFoundException { | |
Class IsolatedClassLoader2 = new IsolatedClassLoader("").loadClass("IsolatedClassLoader"); | |
assert IsolatedClassLoader.class != IsolatedClassLoader2; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment