Difference between getClass().getClassLoader().getResource() and getClass.getResource()?

Java

Java Problem Overview


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

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

Java Solutions


Solution 1 - Java

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")

Solution 2 - Java

> which one should I use in what circumstances?

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.

Solution 3 - Java

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

So:

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.)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJimmy CView Question on Stackoverflow
Solution 1 - JavaJB NizetView Answer on Stackoverflow
Solution 2 - JavaparsifalView Answer on Stackoverflow
Solution 3 - JavaJon SkeetView Answer on Stackoverflow