Re: Detecting if a class is already known
On 7/29/2011 12:47 PM, Ross wrote:
I'm building a plugin loader. I want this loader to be able to load
from .jar files, which may contain multiple classes per plugin. So,
all of these classes need to be loaded in.
However, I don't want to load classes that already exist, e.g. I don't
want there to be the possibility of plugins loading classes which
would conflict with classes already part of the application.
I can easily check if classes are already present in the classpath by
using a method such as:
private boolean known( String className )
{
try
{
Class c = Class.forName( className );
return true;
}
catch( ClassNotFoundException cnfe )
{
return false;
}
}
This will cause a plugin to be rejected if it includes any class which
can be found. But, since plugins should really contain classes defined
in a unique package, I don't think this will cause a problem.
Is there a better way of identifying if plugins are redefining
existing classes, or otherwise creating a potential problem? Or, is
there no possibility of a potential conflict due to the way that
custom classloaders work?
The problem you are trying to avoid will never happen.
You should not load every class but only load the plugin
"start" class.
In case of the same class being in more than one plugin:
If plugins use same classloader then it will be loaded
once from the first definition in classpath.
If the plugins use different classloaders then it will
be loaded as independent classes (classes in memory are
implicit prefixed with classloader) for each plugin.
If your plugins may end up being heavy and using lots of
stuff which would increase the risk of conflicts (the realistic
scenario is that one plugin uses framework ABC in version X
and another plugin uses framework ABC in version Y), then
you should consider multiple classloaders.
Arne