Alternatives for Unsafe field access
John Rose
john.r.rose at oracle.com
Thu Dec 8 21:07:40 UTC 2016
They support private fields. Like MethodHandles the access check is performed at creation time not invocation time. Any class can arrange to make VHs and MHs on its own privates. There will also be super user access for frameworks.
– John
> On Dec 8, 2016, at 12:49 PM, Nathan Mittler <nathanmittler at google.com> wrote:
>
> Hi Roger,
> If I read that correctly, lookups still have to go through access checks
> which would seem to imply that they can't be used for private field access.
> Or am I misunderstanding?
>
>> On Thu, Dec 8, 2016 at 11:51 AM, Roger Riggs <Roger.Riggs at oracle.com> wrote:
>>
>> Hi Nathan,
>>
>> Have you looked at VarHandles? [1]
>> It is possible to use MethodsHandles.Lookup to get a VarHandle to an
>> unreflected field.
>>
>> Roger
>>
>> [1] http://download.java.net/java/jdk9/docs/api/java/lang/invoke
>> /MethodHandles.Lookup.html
>>
>>
>>
>>> On 12/8/2016 1:03 PM, Nathan Mittler wrote:
>>>
>>> Hi everyone,
>>>
>>> Apologies in advance if this isn't the correct forum for this question. My
>>> team is working on an experimental runtime for Google's protocol buffers
>>> which is currently relying on sun.misc.Unsafe to perform various tasks
>>> efficiently. I'm aware that the plan is to eventually remove Unsafe
>>> altogether, and I want to make sure that we still have a way to move
>>> forward with future versions of Java.
>>>
>>> The code is up on a github branch (
>>> https://github.com/google/protobuf/tree/java_experimental).
>>>
>>> For an example of the sorts of things our runtime needs to do, you can
>>> look
>>> at the serialization code (
>>> https://github.com/google/protobuf/blob/java_experimental/
>>> java/core/src/main/java/com/google/protobuf/AbstractProto3Schema.java#L49
>>> ).
>>>
>>> The idea is that the runtime dynamically determines information about
>>> message fields (e.g. field types, offsets) and stores it into a single
>>> buffer. Our main need is fast read/write access to the private fields of
>>> our generated message classes. Java reflection would be too slow and would
>>> require data representation as a list of objects, rather than a continuous
>>> buffer (much less compact and cache-friendly). Security restrictions would
>>> be a concern as well. At first glance at Java 9, I don't see any
>>> facilities
>>> that would help here.
>>>
>>> This would seem to be a fairly common use case a low-level serialization
>>> framework, such as protobuf. Are there any thoughts on how such a use case
>>> could be supported post-Unsafe?
>>>
>>> Thanks,
>>> Nathan
>>>
>>
>>
More information about the core-libs-dev
mailing list