Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #20079

Re: ClassLoader.getSystemResourceAsStream versus this.getClass().getResourceAsStream()

From markspace <-@.>
Newsgroups comp.lang.java.programmer
Subject Re: ClassLoader.getSystemResourceAsStream versus this.getClass().getResourceAsStream()
Date 2012-12-03 12:07 -0800
Organization A noiseless patient Spider
Message-ID <k9j0qj$ftg$1@dont-email.me> (permalink)
References <3c227741-7b7f-4cf8-b188-ce5268894031@googlegroups.com>

Show all headers | View raw


On 12/3/2012 11:29 AM, zyng wrote:
> I am sure the difference between the two have been discussed well:
> the first one is using the System classloader and the second one is
> using the class loader which has loaded this class, most likely a
> child of System classloader, according to what I have found on the
> web.

First, note that there are two separate objects here, ClassLoader and 
Class.  Just because the names of their respective methods are the named 
the same, doesn't mean they do the same thing.

>
> //option 1: InputStream is =
> ClassLoader.getSystemResourceAsStream("hij/hello.txt");
>
> //option 2: InputStream is =
> ResourceTools.class.getResourceAsStream("/hij/hello.txt");

Note in the documentation of the second method call:
" This method delegates to this object's class loader. If this object 
was loaded by the bootstrap class loader, the method delegates to 
ClassLoader.getSystemResourceAsStream(java.lang.String)."

So it's different because it delegates to a different method.  I have to 
guess that the two methods are designed to do different things, in spite 
of their identical names.  I suppose this could be considered a 
"gotcha."  My advice is to consider option 2; I've never seen the first 
form in actual practice.

Why they did things this way, I have no idea.  Classloading pretty 
confusing except in trivial cases.  I think it's best to keep things as 
simple as possible when you resort to loading manually.

For extra fun, look at Thread::getContextClassLoader, which is even more 
correct than option 1 or 2 above in certain circumstances (mainly web apps).

<http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#getContextClassLoader()>

Back to comp.lang.java.programmer | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

ClassLoader.getSystemResourceAsStream versus this.getClass().getResourceAsStream() zyng <xsli2@yahoo.com> - 2012-12-03 11:29 -0800
  Re: ClassLoader.getSystemResourceAsStream versus this.getClass().getResourceAsStream() markspace <-@.> - 2012-12-03 12:07 -0800
    Re: ClassLoader.getSystemResourceAsStream versus this.getClass().getResourceAsStream() Lew <lewbloch@gmail.com> - 2012-12-03 14:04 -0800
      Re: ClassLoader.getSystemResourceAsStream versus this.getClass().getResourceAsStream() markspace <-@.> - 2012-12-03 15:25 -0800
        Re: ClassLoader.getSystemResourceAsStream versus this.getClass().getResourceAsStream() Lew <lewbloch@gmail.com> - 2012-12-03 20:37 -0800
  Re: ClassLoader.getSystemResourceAsStream versus this.getClass().getResourceAsStream() zyng <xsli2@yahoo.com> - 2012-12-04 05:40 -0800
    Re: ClassLoader.getSystemResourceAsStream versus this.getClass().getResourceAsStream() Lew <lewbloch@gmail.com> - 2012-12-04 12:57 -0800

csiph-web