A facility for getting the current method's name
Krystal Mok
rednaxelafx at gmail.com
Tue Sep 27 22:02:28 PDT 2011
Yeah, I'm sure there are a lot of ways one can implement this feature. It's
just the matter of whether or not the feature should be supported by the
core libs.
I can even imagine (ab-)using an annotation processor to pull it off.
Something that looks like:
public class Foo {
public void bar() {
@CurrentMethodName
String __method__ = null; // suppose this local variable is generated by
some refactoring tool
}
}
where @CurrentMethodName is a ElementType.LOCAL_VARIABLE +
RetentionPolicy.SOURCE annotation, and the null assignment gets replaced to
the actual value, by a custom annotation processor at compile time.
Regards,
Kris Mok
On Wed, Sep 28, 2011 at 12:12 PM, Sebastian Sickelmann <
sebastian.sickelmann at gmx.de> wrote:
> Am 27.09.2011 12:35, schrieb Krystal Mok:
>
> Hi Behrang,
>>
>> This reminds me of how people were looking for a "current class literal",
>> something like this:
>>
>> public class Foo {
>> public static void main(String[] args) {
>> // don't want to hard code "Foo.class" here
>> String name = Foo.class.getName();
>> }
>> }
>>
>> and now that JDK7 is out, they've got a new toy that gives them exactly
>> that:
>>
>> java.lang.invoke.**MethodHandles.lookup().**lookupClass()
>>
>> It's not mean't to be fast when used like this, though.
>> The same with what you're looking for, but you've already got backtrace
>> which gives you the correct semantics, just not fast enough, right?
>>
>> On Mon, Sep 26, 2011 at 7:31 PM, Behrang Saeedzadeh<behrangsa at gmail.com**
>> >wrote:
>>
>> Sean, Mario,
>>>
>>> I am looking for something like JavaScript's arguments.callee.name or
>>> Ruby's __method__. AFAIK, accessing the current method's name is a
>>> very cheap operation in JS and Ruby while creating a stack trace is a
>>> moderately expensive operation in Java.
>>>
>>
>> They don't seem to be expensive in JavaScript or Ruby because those
>> languages didn't have fast implementations. Once they do (as the current
>> JS
>> engines and JRuby/Rubinius), this kind of reflective operations will show
>> their cost.
>>
> I think that this can be done at compile-time where instead of the method
> call
> a constant will be inserted into the bytecode of the class. I don't see
> any dynamic resolve in here. The main problem i see is how to specify this
> in java syntax.
>
> Just replacing the INVOKESTATIC (lets say ActualMethod.getName()) into an
> LDC
> breaks the common pattern how a static Methodcall in compiled to bytecode.
> Or
> are there any places in javac where such a replacement for special cases is
> already done?
> And a new Keyword for just inserting the methodname is a bit to big!?
> Maybe the ActualMethod.getName() should be marked with a annotation
> @Constant-Replace
>
> If i want to check if this is feasible i would write a small
> ClassFileTransformer
> that exchanges any static calls of ActualMethod.getName() to the LDC at
> loadtime.
> I think this is the other place where it can be done. Unfortunately i don't
> see that this
> can be done on jvm in general, cause all those other languages that are
> running
> on the jvm don't need such a feature. So i think javac or some custom post
> processing
> would be the best place to do this.
>
> -- Sebastian
>
>> Regards,
>> Kris Mok
>>
>
>
More information about the jdk8-dev
mailing list