Proposal: #ReflectiveAccessByInstrumentationAgents

Tim Ellison Tim_Ellison at uk.ibm.com
Wed Jun 29 10:30:45 UTC 2016


mark.reinhold at oracle.com (Mark Reinhold) wrote on 28/06/2016 22:21:15:
> Issue summary
> -------------
> 
>   #ReflectiveAccessByInstrumentationAgents --- As noted in the related
>   issue #ReflectiveAccessToNonExportedTypes [1], the core reflection API
>   cannot be used to gain access to members of packages that are not
>   exported by their defining modules.  Even if that issue is addressed
>   for the use cases cited, a distinct use case is that of 
instrumentation
>   agents that need to enable injected code to invoke non-public methods
>   and access non-public fields.  A possible solution for this use case 
is
>   specifically to provide instrumentation agents with the ability to use
>   core reflection, or some equivalent, even on elements of non-exported
>   packages. [2]
> 
> Proposal
> --------
> 
> Extend the `java.lang.instrument.Instrumentation` interface, and the
> corresponding JVM TI native API, to support a `redefineModule` method.
> This method is roughly analogous to the existing `redefineClasses`
> method.  It will allow instrumentation agents to update an existing
> module, represented by a `java.lang.reflect.Module` object, to read
> additional modules, export additional packages, use additional services,
> and provide additional services.
> 
> Remove the `addModuleReads` method from the `Instrumentation` interface,
> and remove the `AddModuleReads` and `CanReadModule` functions from JNI,
> since they are no longer needed.
> 
> 
> Notes
> -----
> 
>   - This new API will not allow read, export, uses, and provides
>     relationships to be dropped at run time.  The use cases do not
>     require this, and implementing it would be very difficult.
> 
>   - A sufficiently-skilled instrumentation-agent developer can already 
do
>     some of this with the existing API, by injecting new classes into
>     target modules with initializers that invoke the necessary `Module`
>     methods.  This is, however, awkward at best.
> 
>   - Objects that implement the `Instrumentation` interface are already
>     very powerful, since they can be used to redefine arbitrary classes.
>     Just as is the case today, in order to preserve platform integrity
>     instrumentation agents must be coded very carefully so that they do
>     not leak such objects to user code.
> 
> 
> [1] http://openjdk.java.net/projects/jigsaw/spec/issues/
> #ReflectiveAccessToNonExportedTypes
> [2] http://openjdk.java.net/projects/jigsaw/spec/issues/
> #ReflectiveAccessByInstrumentationAgents

I agree with this proposal.  As already pointed out, instrumentation 
agents
are a powerful, somewhat specialist case that suits the full set of 
manipulation
capabilities.

Regards,
Tim

Unless stated otherwise above:
IBM United Kingdom Limited - Registered in England and Wales with number 
741598. 
Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU


More information about the jpms-spec-experts mailing list