Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Java > Detecting if a class is already known

Reply
Thread Tools

Detecting if a class is already known

 
 
Ross
Guest
Posts: n/a
 
      07-29-2011
Hi all.

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?
 
Reply With Quote
 
 
 
 
markspace
Guest
Posts: n/a
 
      07-29-2011
On 7/29/2011 9:47 AM, Ross wrote:

> However, I don't want to load classes that already exist



This is already covered by the ClassLoader docs. You can also search
for a tutorial how it all works, but basically you overload findClass
and don't touch the other methods and it all works out. loadClass
automatically searches for existing classes first, then only calls
findClass if it needs too. IIRC.


> private boolean known( String className )



<http://download.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#findLoadedClass%28java.lang.Strin g%29>
 
Reply With Quote
 
 
 
 
Lew
Guest
Posts: n/a
 
      08-02-2011
markspace wrote:
> Ross wrote:
>> However, I don't want to load classes that already exist

>
> This is already covered by the ClassLoader docs. You can also search


And by the default classloader behavior.

> for a tutorial how it all works, but basically you overload findClass
> and don't touch the other methods and it all works out. loadClass
> automatically searches for existing classes first, then only calls
> findClass if it needs too. IIRC.
>
>
>> private boolean known( String className )

>
>
> <http://download.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#findLoadedClass%28java.lang.Strin g%29>


I'm not even sure he needs to do anything new to the classloader. The default classloader action is to not load a class it already has. So what new is needed?

--
Lew
 
Reply With Quote
 
Arne Vajh°j
Guest
Posts: n/a
 
      08-06-2011
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


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Does any widely-known program to extract template parameters requirements from source code already exist? Pavel Shved C++ 11 11-12-2007 09:22 AM
Nested Class, Member Class, Inner Class, Local Class, Anonymous Class E11 Java 1 10-12-2005 03:34 PM
minor bugs, usually already known? Splibbilla Firefox 1 09-20-2005 10:13 PM
Detecting if a table in a database already exists ? Thorsten Meininger Java 1 10-12-2004 11:57 PM
How to instatiate a class of which the name is only known at runtime? Marco Herrn Python 14 09-15-2003 11:56 PM



Advertisments