On Fri, 27 Aug 2021 13:28:08 GMT, Maurizio Cimadamore <[email protected]>
wrote:
> Overall, seems like a solid piece of work. I did not review in full the
> intricacies with caller sensitive (as I don't know that area too much), but
> the general rewrite seems solid.
Thanks for the review.
> One thing I had trouble with was the naming of the various method accessors -
> for instance, DirectMethodAccessorImpl vs. NativeMethodAccessorImpl vs.
> DelegatingMethodAccessorImpl vs. AdaptiveMethodAccessor (and there's more).
> It's not always easy to grasp from the method name which one is new and which
> one is old. Maybe sprinkling the `Handle` word on any accessor impl would
> help a bit with that.
I can see how this could be confusing. Sprinkling the `Handle` word may help.
I will try that.
> Similarly, I found the `ClassByteBuilder` name a bit weak, since that is
> meant to only create instance of custom MHInvokers. A more apt name will help
> there too.
What about `InvokerBuilder` (it creates either MHInvoker or VHInvoker)?
> I also had some issues parsing the flow in
> `ReflectionFactory::newMethodAccessor` (and constructor, has similar issue):
>
> ```
> if (useNativeAccessor(method)) {
> return DirectMethodAccessorImpl.nativeAccessor(method,
> callerSensitive);
> }
> return MethodHandleAccessorFactory.newMethodAccessor(method,
> callerSensitive);
> ```
>
> Why can't logic like this be encapsulated in a single factory call? E.g. it
> seems like the code is would like to abstract the differences between the
> various accessor implementations, but it doesn't seem to get all the way
> there (it's also possible I'm missing some constraint here).
We have to avoid to initialize the `MethodHandleAccessorFactory` class until
`java.lang.invoke` is initialized. because
`MethodHandleAccessorFactory::<clinit>` creates lookup object and method
handles. I agree it's cleaner to encapsulate these in one single factory
method. I think moving the the static fields and the initialization to a
holder class may be a way to do it. I will give it a try.
> src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java line
> 200:
>
>> 198: return
>> MethodHandleAccessorFactory.newMethodAccessor(method, callerSensitive);
>> 199: } else {
>> 200: if (!useDirectMethodHandle && noInflation
>
> seems to me that the `!useDirectMethodHandle` is useless here (always false) ?
Good catch! Will fix.
-------------
PR: https://git.openjdk.java.net/jdk/pull/5027