bidirectional dependencies in AOP-like languages?

Alan Bateman Alan.Bateman at oracle.com
Wed May 10 07:24:41 UTC 2017


On 09/05/2017 18:19, Stephan Herrmann wrote:

> :
>
> Let's assume a language using Instrumentation & ClassFileTransformer for
> weaving an aspect into its base.
> Lets assume the aspect statically declares a dependence on that base.
> Now the weaver needs to make the aspect accessible for base-to-aspect 
> calls,
> i.e., insert a dependency inverse to the existing one.
>
> Has anybody tested, whether Instrumentation.redefineModule() works for
> this kind of use case? Are there any caveats? Better approaches?
If the byte code weaving is done at class load time or dynamically 
(retransformClasses/redefineClasses) then you should be able to get this 
to work, assuming the readability and visibility supports it.

I can't quite tell if "base" means "java.base". Assuming it is, then you 
should be able to instrument code in java.base with references to 
classes that you have on the boot class path. As part of the 
compatibility support to keep existing agents working, the VM will 
update java.base to read the unnamed module of the boot loader when you 
modify a class in java.base. Classes in java.base are defined to the 
boot loader, as is code on the boot class path, so visibility is not an 
issue either. More on this in the "Instrumenting code in modules" and 
"Visibility" sections of the java.lang.instrument docs [1].

If you doing super advanced stuff then you may need to use 
redefineModule to provide additionally readability but you shouldn't 
have any issues there. More likely, visibility will the change when you 
have cycles but if you have that working now then it should continue to 
work.

>
> Is it right that a strategy using compile-time weaving
> (rather than load time weaving and reflection)
> will not work in a modular application (due to #CyclicDependences)?
>
Can you expand a bit on this? Is the user code and aspect compiled to 
different modules with static references to each other?

-Alan

[1] 
http://download.java.net/java/jigsaw/docs/api/java/lang/instrument/package-summary.html



More information about the jigsaw-dev mailing list