前一遍文章讲的是自定义一个在那里都能用的ClassLoader ,而在Eclipse内部其实每一个Plugin都有自己的ClassLoader,所以说我们没有必要再重新定义自己的ClassLoader .现实的代码如下:
public
class
AllPluginsClassLoader
{
private static Loader instance;
public static synchronized ClassLoader getInstance() {
if (instance == null) {
instance = new Loader();
}
return instance;
}
public static ClassLoader getInstance(URL[] classPath, ClassLoader parent) {
return new Loader(classPath, parent);
}
private static class Loader extends URLClassLoader {
private static ClassLoader[] pluginClassLoaders;
public Loader() {
this(new URL[0], null);
}
public Loader(URL[] path, ClassLoader parent) {
super(path, parent);
IPluginDescriptor[] plugins = Platform.getPluginRegistry().getPluginDescriptors();
pluginClassLoaders = new ClassLoader[plugins.length];
for (int i = 0; i < plugins.length; i++) {
pluginClassLoaders[i] = plugins[i].getPluginClassLoader();
}
}
protected Class findClass(String name) throws ClassNotFoundException {
try {
return super.findClass(name);
} catch (ClassNotFoundException ex) {
for (int i = 0; i < pluginClassLoaders.length; i++) {
try {
Class clazz = pluginClassLoaders[i].loadClass(name);
return clazz;
} catch (ClassNotFoundException ex2) {
}
}
throw new ClassNotFoundException(name);
}
}
}
}
private static Loader instance;
public static synchronized ClassLoader getInstance() {
if (instance == null) {
instance = new Loader();
}
return instance;
}
public static ClassLoader getInstance(URL[] classPath, ClassLoader parent) {
return new Loader(classPath, parent);
}
private static class Loader extends URLClassLoader {
private static ClassLoader[] pluginClassLoaders;
public Loader() {
this(new URL[0], null);
}
public Loader(URL[] path, ClassLoader parent) {
super(path, parent);
IPluginDescriptor[] plugins = Platform.getPluginRegistry().getPluginDescriptors();
pluginClassLoaders = new ClassLoader[plugins.length];
for (int i = 0; i < plugins.length; i++) {
pluginClassLoaders[i] = plugins[i].getPluginClassLoader();
}
}
protected Class findClass(String name) throws ClassNotFoundException {
try {
return super.findClass(name);
} catch (ClassNotFoundException ex) {
for (int i = 0; i < pluginClassLoaders.length; i++) {
try {
Class clazz = pluginClassLoaders[i].loadClass(name);
return clazz;
} catch (ClassNotFoundException ex2) {
}
}
throw new ClassNotFoundException(name);
}
}
}
}