FXML and Classloading
Tom Schindl
tom.schindl at bestsolution.at
Thu May 31 06:20:40 PDT 2012
Hi,
Looks like this is a never ending story, when it comes to OSGi ;-) This
time it is the JavaFXBuilderFactory which as it looks like is NOT using
the classloader set using FXMLLoader#setClassloader() hence if one
defined a custom object (which requires constructor parameters) and a
builder - it is not found because the wrong classpath is used.
Now there's a JavaFXBuilderFactory which accepts a classloader but it is
not considered public API.
My feeling is though that the builder factory should use the classloader
of the type class passed as a first search path and only fallback to the
other one it is not found in there.
I think the logic should be something like this:
private Class<?> findBuilder(
Classloader defaultClassloader,
Class<?> objectClass)
throws ClassNotFoundException {
String builderName = objectClass.getName() + "Builder";
try {
return objectClass.getClassloader().loadClass(builderName);
} catch( ClassNotFoundException e ) {
// search only if classloaders are different
if( objectClass.getClassloader() != defaultClassloader) {
return defaultClassloader.loadClass(builderName);
} else {
throw e;
}
}
}
because the objectClass is already loaded through the classloader
defined on the FXMLLoader this fixes all problems of class mismatches, ... .
The other options are:
* provide a constructur on FXMLLoader that allows to pass the
classloader and pass this one on to JavaFXBuilderFactory for
classloading
* make the JavaFXBuilderFactory-constructor that accepts a Classloader
API
My feeling is that using the object-types classloader is the most user
friendly and logic solution - though it has a small performance overhead
because 2 classloaders are searched potentially.
Tom
--
B e s t S o l u t i o n . a t EDV Systemhaus GmbH
------------------------------------------------------------------------
tom schindl geschäftsführer/CEO
------------------------------------------------------------------------
eduard-bodem-gasse 5-7/1 A-6020 innsbruck fax ++43 512 935833
http://www.BestSolution.at phone ++43 512 935834
More information about the openjfx-dev
mailing list