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?
–
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.