42 MILLION uses of Reflection.getCallerClass(int) on Ohloh!?!? Holy crap...
In case anyone is interested, I am almost finished implementing the public API StackTraceFrame and associated C/C++ code. It has been an eye-opening experience, but I think I have it figured out now. I just have to write some tests. Looks like installing and configuring jtreg might be more difficult than cloning and compiling JDK was... Nick On Jul 30, 2013, at 7:01 AM, Jörn Huxhorn wrote: > This whole issue started with the "fix" of > http://bugs.sun.com/view_bug.do?bug_id=8016814 because, obviously, throwing > an UnsupportedOperationException is a straightforward and reasonable way of > fixing an off-by-one problem with the description "returns the wrong stack > frame" (see > http://mail.openjdk.java.net/pipermail/jdk7u-dev/2013-June/006791.html). > Bonus points for doing this instead of just applying the "1-line fix" in the > comments of that bug report. I'm pretty sure that this exception wasn't the > kind of fix the reporter of the bug was looking for. (Yes, I know. The 1-line > fix was applied and is executing if the JVM parameter is set - but this is > not my point.) > > Ironically, the comment on the "fix" regarded a sudden, unexpected > RuntimeException in an unknown amount of third-party code as "Low risk.". > > This is justified by http://bugs.sun.com/view_bug.do?bug_id=8014925 (created > on 2013-05-20 - which is just the blink of an eye in Java time. To put it > into perspective: we missed the tenth birthday of > http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4851444 which requested > this functionality in a proper public API) which contains the following > paragraph: > >> The following describes the transition plan to allow customers to migrate >> their applications away from this private API: >> 1. Disable sun.reflect.Reflection.getCallerClass(int) in 7u40 and provide a >> flag to re-enable it >> 2. Determine how this private API is being used and the use cases >> 3. Remove this private API if there is no valid use case or there is a >> proper replacement for it. Allow at least 2 CPU releases to allow customers >> to make appropriate change. So the earliest for the removal is 7u55. If >> there are valid use cases but no proper replacement, we may keep this >> private API in jdk7u for longer. > > With regards to 3., I think we were able to give examples of "valid use > cases" for this API. > > If the only alternatives available are either slow and fragile (100x slower, > achieved by extending SecurityManager for the sake of calling the protected > getClassContext() method, will break if the RuntimePermission > "createSecurityManager" is not granted by a possibly installed > SecurityManager) or even slower (450x slower, using Throwable) then this is a > showstopper, especially if the code is executed literally millions of times, > as is the case with logging calls. > > Yes. It sucks that a private API call is necessary. Yep, one should not > depend on such a private API. But the RFE to rectify this has been idling for > more than ten years and the performance impact of *not* using it is > substantial. > > The j7u40 change will result in lots of applications simply going BOOM or > acting weird after updating which in turn will slow the adoption of Java > updates. And that isn't a good idea at all with regards to security fixes. It > will likely also prevent reasonable adoption rates for Java 8. Why should I > choose a new Java version if it results in a significantly slower overall > speed of my applications? If all third-party libraries using the API have > been updated so that the application will work at all. > > There's really only one rational way to handle this situation: > - Remove the UnsupportedOperationException from j7u40 und higher Java 7 > versions. > - Restore sun.reflect.Reflection in Java 8. > - Define a proper public API (TBD) with similar performance to the private > API, as requested ten years ago, for Java 9. This functionality is available > in .NET since 1.1, as previously mentioned. > > Anything else will simply hurt the Java platform as a whole and reaffirm the > "Java is slow" mantra. If keeping the "but this wasn't part of the public API > so we did nothing wrong" stance is worth all of this then feel free to just > ignore our objections. > > Seriously, I fail to understand how something like this could have passed the > QA. See http://code.ohloh.net/search?s=Reflection.getCallerClass for a rough > estimate about the impact of this change. This is probably one of the most > used private Java API calls, ever. > > Cheers, > Jörn. > > On 30. Juli 2013 at 06:59:53, Nick Williams > (nicholas+open...@nicholaswilliams.net) wrote: > > > On Jul 29, 2013, at 11:59 PM, Joseph Darcy wrote: > >> >> On 7/29/2013 9:31 PM, Alan Bateman wrote: >>> On 29/07/2013 19:17, David M. Lloyd wrote: >>>> >>>> Your phrasing makes me think I missed something: is the >>>> Reflection.getCallerClass() method being removed due to some technical >>>> issue that it can only be somehow emulated as a workaround? Or is it just >>>> a general cleanup effort? >>>> >>> The sun.reflect.Reflection.getCallerClass(int) method was removed as part >>> of JEP 176 [1]. >>> >>> -Alan. >>> >>> [1] http://openjdk.java.net/jeps/176 >>> >> >> And as a sun.* method, this was officially outside of the exported interface >> of the JDK and not something that should be expected to work if called from >> outside of the JDK. > > As has been said many, many times in the last few days, we are all well aware > of this. It doesn't make the problem any less disastrous for the community. > This needs to be replaced with a public API. > > Nick