Re: Idiom for forcing class loading?
This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.
---910079544-1570119038-1258664458=:3772
Content-Type: TEXT/PLAIN; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8BIT
On Wed, 18 Nov 2009, Lew wrote:
Tom Anderson wrote:
We have a class which does some setup in a static block that needs to
happen early in the lifecycle of the app (this is a dubious design, but
there you go - it's largely forced on us from without). Thus, it needs to
get loaded early. We have an initialiser class which runs at a suitable
time, so that's where we'll load the class. What's the best way to do
this?
...
I could just store it in a local:
void initialise() {
? ? ? ? Class foo = Foo.class;
}
Since i [sic] actually have several classes, i [sic] could put them in an array:
void initialise() {
? ? ? ? Class[] loadedClasses = new Class[] {Foo.class, Bar.class, Baz.class};
}
Am i [sic] right in thinking that all of these will force loading of Foo?
Yes, but not initialization. If all you need is loading, you're fine,
but if you need initialization, you're not..
Mere reference to the 'class' literal is forbidden to initialize the
class. JLS 12.4.1
<http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.4.1>
Aha! I had no idea this was the case! Thanks, and thanks to everyone else
who pointed it out.
This restriction is enforced in Sun JVMs starting with Java 5.
'Class.forName( String )' is documented to cause initialization but
'Class#getName()' is not so documented.
<http://java.sun.com/javase/6/docs/api/java/lang/Class.html#forName
(java.lang.String)>
<http://java.sun.com/javase/6/docs/api/java/lang/Class.html#getName()>
It may be, however, that the latter is one of the "certain reflective
methods in class Class" to which the JLS refers, but without explicit
documentation of such it's a fragile promise/premise.
Quite so!
tom
--
Tubes are the foul subterranean entrails of the London beast, stuffed
with the day's foetid offerings. -- Tokugawa
---910079544-1570119038-1258664458=:3772--