Hi Peter, You found that annoying restriction :-) at this point i think this is mostly redundant.
This is something i planned to update and limit the restriction to code within j.l.invoke and sun.invoke packages. I'll follow up with a patch soon to unblock, but feel free to beat me to it if you wish. Paul. > On 14 Apr 2016, at 16:25, Peter Levart <peter.lev...@gmail.com> wrote: > > Hi Paul, > > I wanted to try using VarHandles for code internal to JDK but there's a > problem with MethodHandles.lookup(). It doesn't allow the caller class loaded > by the bootstrap class loader and located in either java.* or sun.* (but not > sun.invoke.*) packages: > > > private static void checkUnprivilegedlookupClass(Class<?> lookupClass, > int allowedModes) { > String name = lookupClass.getName(); > if (name.startsWith("java.lang.invoke.")) > throw newIllegalArgumentException("illegal lookupClass: > "+lookupClass); > > // For caller-sensitive MethodHandles.lookup() > // disallow lookup more restricted packages > if (allowedModes == ALL_MODES && lookupClass.getClassLoader() == > null) { > if (name.startsWith("java.") || > (name.startsWith("sun.") && > !name.startsWith("sun.invoke."))) { > throw newIllegalArgumentException("illegal lookupClass: " > + lookupClass); > } > } > } > > > ...strangely, other bootstrap class loaded callers located in jdk.* are > allowed. Why such distinction? Is there or will there be an official way to > use VarHandles in JDK code and not having to resort to work-arounds like > MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP").setAccessible(true)? > > > Regards, Peter >