JDK 8 RFR for JDK-7185456 : (ann) Optimize Annotation handling in java/sun.reflect.* code for small number of annotationsC
Joel Borggrén-Franck
joel.franck at oracle.com
Wed Mar 27 14:18:03 UTC 2013
On 03/27/2013 03:00 PM, Peter Levart wrote:
> On 03/27/2013 02:00 PM, Joel Borggrén-Franck wrote:
>> Hi Peter,
>>
>> On 03/27/2013 01:31 PM, Peter Levart wrote:
>>
>>> I also don't know
>>> whether having LinkedHashMap instead of plain HashMap is necessary, since it
>>> is initialized with defaults from plain HashMap (which is hashCode %
>>> capacity ordered) and only some of defaults are overridden in parsing loop
>>> in general. For example, having this annotation:
>>>
>>> @interface Ann {
>>> String one();
>>> String two() default "2";
>>> }
>>>
>>> and usage:
>>>
>>> @Ann(one = "1")
>>>
>>> ...toString will print: @Ann(two = "2", one = "1")
>>>
>>
>> While there perhaps is no natural ordering between the sets of default
>> elements and non-default elements you probably want an order following
>> source as closely as possible among the non-default elements.
>
> What is the order of elements in java class file (the bytes that the parser
> interprets)? Is it taken from the declaration of annotation (the order of
> methods in annotation interface) or from the use-site of the annotation? Is
> this specified?
>
In general javac tries to keep source order on "things" when emitting to a
class file. I believe this is often specified as natural order, but don't
trust me on this. In this specific case I would guess element use order from
the annotatio instance.
In the following small example I note that 'b' comes before 'a' in the const
pool but the RuntimeInvisibleAnnotations 'a' is before 'b'. I don't think
this is a coincidence.
anno-order$ cat T.java
@T(a="XYZ", b="DEF")
public @interface T {
String b();
String a();
}
anno-order$ javap -v T.class
Classfile /localhome/src/test/anno-order/T.class
Last modified Mar 27, 2013; size 239 bytes
MD5 checksum e1c7d8d76842d219c9853463af37830a
Compiled from "T.java"
public interface T extends java.lang.annotation.Annotation
SourceFile: "T.java"
RuntimeInvisibleAnnotations:
0: #10(#6=s#11,#4=s#12)
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT, ACC_ANNOTATION
Constant pool:
#1 = Class #13 // T
#2 = Class #14 // java/lang/Object
#3 = Class #15 // java/lang/annotation/Annotation
#4 = Utf8 b
#5 = Utf8 ()Ljava/lang/String;
#6 = Utf8 a
#7 = Utf8 SourceFile
#8 = Utf8 T.java
#9 = Utf8 RuntimeInvisibleAnnotations
#10 = Utf8 LT;
#11 = Utf8 XYZ
#12 = Utf8 DEF
#13 = Utf8 T
#14 = Utf8 java/lang/Object
#15 = Utf8 java/lang/annotation/Annotation
For more examples of order discussions see the recent discussion on
enhanced-metadata-spec-discuss at openjdk.java.net on annotation ordering in
reflection and javax.lang.model.
cheers
/Joel
More information about the core-libs-dev
mailing list