Hi,
in my opinion, the problem here is that there are two types of use
cases that need a different "default" behavior with respect to exporting
packages in runtime and if we decide to use the current behavior, the
use cases that need to export everything by default in runtime can lead
to cumbersome configuration, because the packages must be exported one
by one. If we had a way to specify that we export in runtime all the
packages (with "ALL" or "*"), then in one single line we would be able
to express what we want to do. For instance:
..
exports dynamic ALL to java.ee;
exports dynamic ALL to org.springframework.core;
..
or if it's necessary:
..
exports dynamic ALL;
..
Although my projects' use cases wouldn't need to export in runtime
many packages, I can imagine an application with dependency injection,
where the majority of classes have DI annotations (like "@Inject") that
must be read in runtime by the DI framework. As the application is built
by assembling a lot of classes annotated with this framework's
annotation types, the packages needed to be exported could be a lot.
Thus, exporting all of the packages in runtime can be cumbersome and
having a one line export statement can be useful.
The suggestion of Simon to reverse the runtime export behavior is
interesting, but I'm not sure that this must be the default. I
personally prefer that the packages are unexported (even in runtime) by
default and specify what to export (and to whom, if possible, with the
qualified version of it). For the use cases where all the packages must
be exported in runtime, or when there are too many to be specified
manually, a "ALL" or "*" wildcard would help.
Best regards,
Xavi
On 09.07.2016 23:07, Simon Nash wrote:
Paul Benedict wrote:
For those who are still supporters of preventing non-exported types from
being reflected, I think a compromise can still be found, but it's
not in
this proposal. Here are two other alternatives I hope the EG will
consider:
1) Introduce a new permission type to allow non-exported types to be
reflected. I don't find it acceptable the module gets to dictate what
can't
be reflected. I believe this should be controlled and configured
externally
-- certainly not the module itself.
2) Allow layers to control if non-exported types can be reflected.
Perhaps
the JDK sets its own layers to "false", but Containers and what they
deploy
can be separately configured, each. For example, maybe WebLogic won't
allow
itself to have its non-exported types reflected, but if each EAR gets
its
own layers, I could configure WebLogic to allow me to reflect everything
within the EAR.
PS: I don't see #1 and #2 to be mutually exclusive.
Cheers,
Paul
I would like to propose another possible compromise that might satisfy
both
of the following requirements that have been expressed on this thread:
1) My module should completely encapsulate some internal classes and make
them invisible to the outside world
2) My module or library needs reflective access to internal classes in
other modules in order to function correctly
At present, a module can mark its packages as:
exported at compile time and runtime
exported only at runtime via reflection
never exported (the default)
Instead, these options could change to:
exported at compile time and runtime
exported at runtime only via reflection (the default)
never exported (hidden)
This would allow modules to mark certain packages as "hidden" if these
packages contain internal methods or fields that should be never be
accessible externally under any circumstances. The default would be
to allow reflection by other modules or libraries that need such access.
Simon