Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

What is the difference between getClass().getClassLoader().getResource() and getClass.getResource() ?

When retrieving files from resources, which one should I use in what circumstances?

Basically (from the question @Reimeus linked) the way the relative path lookups work. Class.getResource looks it up relative to the class's package, and ClassLoader.getResource doesn't. Brian Feb 6, 2013 at 21:57

The second one calls the first one. The difference is described in the javadoc.

The first one takes paths that don't start with a / , and always starts at the root of the classpath.

The second one takes path that can start with a / . If it does, it starts at the root of the classpath. If not, it starts at the package of the class on which the method is called.

So getClass().getClassLoader().getResource("foo/bar.txt") is equivalent to getClass().getResource("/foo/bar.txt") .

And, assuming getClass() returns a class that is in the package foo , getClass().getResource("bar.txt") is equivalent to getClass().getClassLoader().getResource("foo/bar.txt")

Neither. You should call Thread.currentThread().getContextClassLoader() .

This has the benefit of not needing to be changed depending on whether you're calling from a static or instance method.

And more important, it will properly handle classloader delegation inside a container. If you don't use it, you might find that an "application" resource isn't found because the class that's loading it was loaded by a classloader higher up the delegation hierarchy.

Basically, Class.getResource() allows you to specify a path relative to the package of the class, whereas ClassLoader.getResource() is always an "absolute" path.

foo.bar.Baz.class.getResource("data.txt")

is equivalent to:

some.Other.class.getResource("/foo/bar/data.txt")

and they're both equivalent to:

some.Other.class.getClassLoader().getResource("foo/bar/data.txt")

(Assuming some.Other and foo.bar.Baz are loaded by the same classloader, of course.)

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.