commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Juozas Baliuka" <bali...@centras.lt>
Subject Re: Re: ClassCastException raised in newFactory() method when starting from JUnit test
Date Thu, 02 May 2002 18:16:35 GMT
Hi,
"Class.forName(String name)" Documentation  about "currentClassLoader" and
"Thread" and this sometimes confuses :

1)"  Class.forName(className, true, currentLoader) where currentLoader
denotes the defining class loader of the current class. "
 This is about "currentLoader"
2)" Class t = Class.forName("java.lang.Thread") "
This is nothing about Thread.currentThread().getContextClassLoader(), it is
not very good example in documentation.

Generaly:
Thread.currentThread().getContextClassLoader() != "currentClassLoader" and
"currentClassLoader" != ClassLoader.getSystemClassLoader();

"ContextClassLoader" can be set by application or container.
"currentClassLoader" is  callers classloader, "current class" is class on
top of  thread stack.

It is not good idea in common code to use "ContextClassLoader",
"currentClassLoader" or "SystemClassLoader".
I think the best idea to add method with "classLoader" paramater, and to
have "sortcut" for "defaut" ClassLoader,
"default"  can be any of them, it because all of them are "good".

Java Class loading mechanism is very trivial:


( class1.getClassLoader().equals(class2.getClassLoader() ) and
class1.getName().equals(class2.getName())  ) <==>
( class1.getClassLoader() == class2.getClassLoader()  and
class1.getName().equals(class2.getName())  )<==>
( class1 == class2 ) ==> ( class1.getName() == class2.getName()  )

 Class visibility for classloader depends on "protected Class
findClass(String name)" implementation.
If  1:"ContextClassLoader" and 2:"currentClassLoader" are not the same
instances
it is very possible some classes with the same name are visible for 1 but
not for 2,
and some can have the same name but not the same type.


----- Original Message -----
From: "Rice Yeh" <riceyeh@netscape.net>
To: ""Jakarta Commons Developers List"" <commons-dev@jakarta.apache.org>
Sent: Thursday, May 02, 2002 7:18 PM
Subject: RE: Re: ClassCastException raised in newFactory() method when
starting from JUnit test


> Hi,
>   newFactory() use thread context classloader to load class. It is like
>
> clazz = classLoader.loadClass(factoryClass);
> return (LogFactory) clazz.newInstance();
>

> where classLoader is thread context loader. I am confused with java's
classloader's mechanism. Does this problem have anything to do with
namespace? It should be no. Isn't?
>   Another mail said this problem is just like anothe problem rasing
ClassNotFound Exception. Could any detail explanation be provided? Thank
you.
>
> Regards,
> Rice
>
>
>
> "Juozas Baliuka" <baliuka@centras.lt> wrote:
>
> >Sorry,
> >"MyCass obj = (MyCass)Class.forName(MyCass.class.getName());"
> >----- Original Message -----
> >From: "Juozas Baliuka" <baliuka@centras.lt>
> >To: "Jakarta Commons Developers List" <commons-dev@jakarta.apache.org>
> >Sent: Wednesday, May 01, 2002 9:49 PM
> >Subject: Re: ClassCastException raised in newFactory() method when
starting
> >from JUnit test
> >
> >
> >> Hi,
> >> I am not sure about "newFactory()", but in the most problem is like
this:
> >>
> >> MyCass obj = Class.forName(MyCass.class.getName());
> >>
> >> This allways throws ClassCastException if this code is loaded not by
> >> "SystemClassLoader".
> >> In this case we have two diferent classes, the same name but not
> >> ClassLoader.
> >>
> >> This is OK:
> >> MyCass obj = Class.forName(MyCass.class.getName(),true,
> >> MyCass.class.getClassLoader() );
> >>
> >> Both classes have the same name and ClassLoader.
> >>
> >> if "newFactory()" doe's "Class.forName" it must have alternatyve:
> >> "newFactory(ClassLoader cl)" and use "cl" as parameter in
"Class.forName".
> >>
> >>
> >>
> >>
> >> ----- Original Message -----
> >> From: "Rice Yeh" <riceyeh@netscape.net>
> >> To: ""Jakarta Commons Developers List""
<commons-dev@jakarta.apache.org>
> >> Sent: Wednesday, May 01, 2002 2:48 PM
> >> Subject: RE: ClassCastException raised in newFactory() method when
> >starting
> >> from JUnit test
> >>
> >>
> >> > Hi,
> >> > Sorry, I past wrong attachement. The original one will not cause this
> >> problem. I attache a new one, which just moves
> >> >
> >> > Digester d = new Digester();
> >> > System.out.println("OK");
> >> > to testLogging() method.
> >> >
> >> > Regards,
> >> > Rice
> >> >
> >> > riceyeh@netscape.net (Rice Yeh) wrote:
> >> >
> >> > >Hi all,
> >> > >
> >> > > Just wonder why ClassCastException is raised at line 496 of
LogFactory
> >> in newFactory() method when running as a JUnit test? I found this
problem
> >> when running RequiredNameTest in commons-validator. When casting a
class
> >to
> >> some superclass, does classloader from other thread form a namespace
and
> >so
> >> can NOT cast it? Java language spec seems not regulate this. I have
proven
> >> this with a small program.
> >> > > Attached are JUnit test files I use to study this problem.
> >> > >
> >> > >Regards,
> >> > >Rice
> >> > >
> >> > >
> >> > >__________________________________________________________________
> >> > >Your favorite stores, helpful shopping tools and great gift ideas.
> >> Experience the convenience of buying online with Shop@Netscape!
> >> http://shopnow.netscape.com/
> >> > >
> >> > >Get your own FREE, personal Netscape Mail account today at
> >> http://webmail.netscape.com/
> >> > >
> >> >
> >> >
> >> > __________________________________________________________________
> >> > Your favorite stores, helpful shopping tools and great gift ideas.
> >> Experience the convenience of buying online with Shop@Netscape!
> >> http://shopnow.netscape.com/
> >> >
> >> > Get your own FREE, personal Netscape Mail account today at
> >> http://webmail.netscape.com/
> >> >
> >>
> >>
>
>> -------------------------------------------------------------------------
-
> >--
> >> ----
> >>
> >>
> >> > /*
> >> > * TestSuite.java
> >> > * JUnit based test
> >> > *
> >> > * Created on May 1, 2002, 7:38 PM
> >> > */
> >> >
> >> > package test;
> >> >
> >> > import junit.framework.*;
> >> > import org.apache.commons.digester.Digester;
> >> >
> >> > /**
> >> > *
> >> > * @author Rice Yeh
> >> > */
> >> > public class LoggingFromDigestTest extends TestCase
> >> > {
> >> >
> >> > public LoggingFromDigestTest(java.lang.String testName)
> >> > {
> >> > super(testName);
> >> > }
> >> >
> >> > public static void main(java.lang.String[] args)
> >> > {
> >> >
> >> >
> >> > junit.swingui.TestRunner.run(suite());
> >> > }
> >> >
> >> > public void setUp()
> >> > {
> >> >
> >> > }
> >> >
> >> >
> >> >
> >> > public static Test suite()
> >> > {
> >> > TestSuite suite = new TestSuite(LoggingFromDigestTest.class);
> >> >
> >> > return suite;
> >> > }
> >> >
> >> > public void testLogging()
> >> > {
> >> > Digester d = new Digester();
> >> > System.out.println("OK");
> >> > }
> >> >
> >> > public void tearDown()
> >> > {
> >> > }
> >> > }
> >> >
> >> >
> >>
> >>
>
>> -------------------------------------------------------------------------
-
> >--
> >> ----
> >>
> >>
> >> > --
> >> > To unsubscribe, e-mail:
> >> <mailto:commons-dev-unsubscribe@jakarta.apache.org>
> >> > For additional commands, e-mail:
> >> <mailto:commons-dev-help@jakarta.apache.org>
> >>
> >>
> >> --
> >> To unsubscribe, e-mail:
> ><mailto:commons-dev-unsubscribe@jakarta.apache.org>
> >> For additional commands, e-mail:
> ><mailto:commons-dev-help@jakarta.apache.org>
> >>
> >
> >
> >--
> >To unsubscribe, e-mail:
<mailto:commons-dev-unsubscribe@jakarta.apache.org>
> >For additional commands, e-mail:
<mailto:commons-dev-help@jakarta.apache.org>
> >
> >
>
>
> __________________________________________________________________
> Your favorite stores, helpful shopping tools and great gift ideas.
Experience the convenience of buying online with Shop@Netscape!
http://shopnow.netscape.com/
>
> Get your own FREE, personal Netscape Mail account today at
http://webmail.netscape.com/
>
>
> --
> To unsubscribe, e-mail:
<mailto:commons-dev-unsubscribe@jakarta.apache.org>
> For additional commands, e-mail:
<mailto:commons-dev-help@jakarta.apache.org>
>


--
To unsubscribe, e-mail:   <mailto:commons-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:commons-dev-help@jakarta.apache.org>


Mime
View raw message