No. Originally it /deleted/ getCallerClass(int) and replaced it with 
getCallerClass(). This happened in Java 1.7.0_21. But that broke about a 
billion open source projects, so we tried for months to convince them to create 
a public API to replace it. I even submitted a proposal and patch, which they 
ultimately rejected. They did, however, agree to restore getCallerClass(int) in 
a deprecated but unrestricted state in 1.7.0_40+ and 1.8.0_+ until they could 
create a public API to replace it in Java 9.

Like I said ... go through the archives. :-)

N

On Feb 9, 2014, at 1:58 PM, Matt Sicker wrote:

> So does JDK8 add that security restriction to getCallerClass(int) as well?
> 
> 
> On 9 February 2014 13:57, Nick Williams <nicho...@nicholaswilliams.net> wrote:
> Yes. The C++ code enforces the restriction. I've edited it, so I know it 
> first hand. :-)
> 
> Nick
> 
> On Feb 9, 2014, at 1:51 PM, Matt Sicker wrote:
> 
>> Then I'm guessing abuse of JNI is out of the question, too?
>> 
>> 
>> On 9 February 2014 13:41, Nick Williams <nicho...@nicholaswilliams.net> 
>> wrote:
>> There have been extensive discussions about getCallerClass(), which you can 
>> find throughout the archives of the developer's list and the JDK 
>> core-libs-dev list. In very abbreviated form, only privileged, JDK code can 
>> call getCallerClass(). They initially removed getCallerClass(int), but we 
>> convinced them to restore it until they could come up with a public API 
>> replacement in Java 9.
>> 
>> We cannot do as you suggest.
>> 
>> Nick
>> 
>> 
>> On Feb 9, 2014, at 1:39 PM, Matt Sicker wrote:
>> 
>>> Now I'm not sure if this is official, but I was digging around the JDK8 
>>> code and found a neat additional method in sun.reflect.Reflection. The old 
>>> getCallerClass(int) method has been deprecated, but instead, there's a 
>>> getCallerClass() method that effectively does the same thing as 
>>> getCallerClass(2). This method is documented as ignoring any reflective 
>>> method calls in the stack. It delegates to a native method call 
>>> (JVM_GetCallerClass(JNIEnv*, int)) which appears to still be 
>>> OpenJDK-specific.
>>> 
>>> Anyway, this brings up an interesting use-case of the old 
>>> getCallerClass(int) method. From what I've seen in various places in the 
>>> source code, getCallerClass(int) is almost always (if not always) called 
>>> with the value of "2". Thus, what I'd propose is to introduce a 
>>> getCallerClass() method that defaults to the usual stack depth. I'd prefer 
>>> to see this sort of helper class in log4j-api instead of duplicating this 
>>> functionality in at least 2 or 3 separate locations as it is now.
>>> 
>>> -- 
>>> Matt Sicker <boa...@gmail.com>
>> 
>> 
>> 
>> 
>> -- 
>> Matt Sicker <boa...@gmail.com>
> 
> 
> 
> 
> -- 
> Matt Sicker <boa...@gmail.com>

Reply via email to