(Accidental enter hit during my last mail.)

To give a short update on this:

I have now updated my code generation library Byte Buddy to fallback to
sun.misc.Unsafe::defineClass for injecting types. I find this really
unfortunate as I managed to avoid using Unsafe in Byte Buddy in five years
and I am rather unhappy with this solution myself. Byte Buddy and cglib,
another library I help maintain, amount to over 10 million yearly downloads
and are consumed by a lot of infrastructure, also including the Spring
framework which is not even accounted for in these download statistics due
to its approach of copying the code without maintaining an explicit
dependency. I am currently planing to also update cglib to using Unsafe
rather than calling protected methods on ClassLoader as I do not see
another way.

I am really not trying to work against Jigsaw and I would prefer to not
introduce a dependency to sun.misc.Unsafe to millions of Java projects. At
the same time, I am under a bit of preasure myself to retain compatibility
for my APIs what I cannot currently provide with the given constraints
without any backdoors for library developers. This is especially true for
cglib where even minor changes like the replacing of private field types
often causes a lot of pain for adoperts.

I understand that the latter problem is approached by Jigsaw and I would
also prefer if this was something I did not have to deal with. At the same
time, its about 20 years too late to change that. At the end of the day,
there is a good reason that classes like Vector or Stack are still included
in the Java packages, removing those classes would most likely cause a lot
of trouble. I just really hope that it is considered that library
maintainers face similar problems and just the many million downloads of
tools that depend on such funcationality hopefully prove that we have
created something useful that made Java a success and is worth being
enabled with low-level APIs.

I think it is in the platform's best interested if this happens in a
structured manner where the access to such low-level is supported and
therefore stable and controllable via infrastructure like a security
manager. Otherwise, this will only trigger even uglier hacks compared to
using the Unsafe class. I am still convinced that the capability of calling
protected methods after setting setAccessible(true) would solve many of the
current problems. I have talked to quite a few of other tools developers
about this and we are all about anxious about these changes and how we can
support Java 9 and Jigsaw. Many people now update their tools to inject
helper classes into packages what is possible by Unsafe::defineClass. I
think that given the current solution, Unsafe will eventually be used much
more than currently. Other approaches set AccessibleObject:override to true
using Unsafe::defineField. A third solution I have tried creates a subclass
of some class where for example defineClass is invoked within a public
method and where the "this" reference is replaced with a field value to
invoke the protected method on some other instance of ClassLoader. The
latter approach is my current option to avoid Unsafe but its also rather
dirty.

I really hope that some official API makes the cut. And allowing
accessibility to protected methods via a security manger seems like a good
option to me. In the end, I am still planing to remove the Unsafe fallback
the first day a solution is offered.

All the best, Rafael

Reply via email to