Unsichtbares Feld und Modifikator in Log4j Logger

8

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.)

    
Rafael Winterhalter 14.04.2016, 20:08
quelle

1 Antwort

6

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 ...

    
Aleksey Shipilev 14.04.2016, 22:00
quelle

Tags und Links