So based on Tim's suggestion, I have something working. I'm running
full tests now, and if things are hunky, will commit w/ tests in the
morning...
geir
On Feb 7, 2007, at 8:48 PM, Geir Magnusson Jr. wrote:
On Feb 7, 2007, at 11:24 AM, Glyn Normington wrote:
"Geir Magnusson Jr." <[EMAIL PROTECTED]> wrote on 07/02/2007 15:36:01:
>
> On Feb 7, 2007, at 7:56 AM, Tim Ellison wrote:
>
> >
> >
> > protected synchronized Class<?> loadClass(String className,
> > boolean resolveClass) throws ClassNotFoundException {
> >
> > if (this == getSystemClassLoader()) {
> > int index = className.lastIndexOf('.');
> > String pkgName = index > 0 ? className.substring(0, >
> index) : "";
> >
> > System.out.println("Checking visibility for " + pkgName);
> > if (!pkgName.startsWith("java.") && !pkgName.startsWith
> > ("javax.")
> > && !pkgName.startsWith("org.ietf.jgss")
> > && !pkgName.startsWith("org.omg")
> > && !pkgName.startsWith("org.w3c.dom")
> > && !pkgName.startsWith("org.xml.sax")) {
> > throw new ClassNotFoundException(className);
> > }
> > }
> > return super.loadClass(className, resolveClass);
> > }
> >
>
> Revealing my ignorance about java classloading :
>
> Why wouldn't we need to care about the caller? (This is what
had me > going into the VM first...) What if loadClass() is
getting called by > an implementation class, which does need
access to the internal > packages that are prohibited for app
classes?
If the VM needs to resolve a reference from class A to class B, it
will call loadClass on the defining class loader of A. (The
defining class loader of A is the class loader whose defineClass
created class A. You can get the defining class loader of a class
via Class.getClassLoader, although the bootstrap class loader is
represented as null.)
This I knew :)
Back to your questions. An implementation class will have been
defined by the bootstrap class loader so if it needs to reference
other classes, the VM will resolve those references using the
bootstrap class loader. so you don't need to worry about the
caller as the application class loader (AKA the system class
loader) won't get a look in when implementation classes are being
resolved.
Yes, this solves my confusion. I was getting confused by the sys
loader vs the boot loader.
Thanks, Glyn. Good to see you around here :)
geir
Glyn
PS. I subscribed to this list earlier in order to post. But my
post didn't get sent back to me and I'm not using gmail.