Beim Betrachten der Klassendatei für org.apache.log4j.Logger
wird ein synthetisches Feld vom Typ Class
mit dem Namen class$org$apache$log4j$Logger
definiert.
Aus dem Blick auf den Byte-Code wird klar, dass dieses Feld die selbstreferenzierte Klasse aus einer Zeit darstellt, in der der konstante Pool noch keine Typen referenzieren konnte. Was ich jedoch seltsam finde, ist der Modifikator dieses Feldes, der 0x41008
ist, der ein private
, synthetic
Feld anzeigt (dem ich folgen kann), aber einen Modifizierer 0x40000
hinzufügt, den ich nirgends dokumentiert finden kann.
Woher kommt dieser Modifikator bei Bit 19 und was drückt er aus? (Log4j ist für Java 1 kompiliert.)
javap ist mit dieser Klassendatei vollkommen zufrieden:
%Vor% access_flags sollen u2
sein, also 2-byte unsigned. Es ist verwirrend, 0x41008
zu sehen, was größer ist als u2
. Einige Tools sind dafür bekannt, dass sie access_flags in größeren Typen speichern und zusätzliche Bits injizieren (ASM macht es, JVMs tun es, etc.) Ich weiß, dass Sie mit ASM lesen, also ist dies wahrscheinlich das, was Sie betrachten:
org / objectweb / asm / ClassReader.java:
%Vor%org / objectweb / asm / ClassWriter.java:
%Vor%Die Frage ist, wie kommt es zu Ihnen ...