IllegalAccessException after updating 2.1 to 2.2
lehmann at media-interactive.de
Thu Aug 16 08:51:20 PDT 2012
today I updated from 2.1 to 2.2 - and received an exception during FXML
loading which was not present in 2.1. Apparently the 2.2 loader looks
for an "initialize" method in the controller and its super classes. In
my case it finds a protected initialize() in a legacy super class which
is used in Swing. Later on it fails to invoke that initialize() because
it is not made accessible (having no @FXML annotation, of course).
> Caused by: javafx.fxml.LoadException: java.lang.IllegalAccessException: Class javafx.fxml.FXMLLoader can not access a member of class mint.panel.MintContextPanel with modifiers "protected"
> at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2184)
> at mint.javafx.MintFXUtils.loadWithController(MintFXUtils.java:86)
> ... 8 more
> Caused by: java.lang.IllegalAccessException: Class javafx.fxml.FXMLLoader can not access a member of class mint.panel.MintContextPanel with modifiers "protected"
> at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
> at java.lang.reflect.Method.invoke(Unknown Source)
> at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2182)
> ... 9 more
As a workaround I renamed the initialize() method to something
completely different and that worked. But I'd rather not have to do
this. It is legacy code, and there are several extending classes
overriding the protected method.
Also, if the existing method in the super class was public already,
FXMLLoader would have called initialize() unexpectedly.
Looking at the code change from 2.1 to 2.2 this seems to be done
intentionally: now the code looks for any no-args initialize method via
reflection if Initializable is not implemented, thus breaking backward
Can we just require the non-interfaced initialize() method to be
annotated with @FXML? That would clearly document the FX related
intention for a very common method name...
More information about the openjfx-dev