2016-04-14 14 views
8

Quando si esamina il file di classe per org.apache.log4j.Logger, viene definito un campo sintetico di tipo Class con nome class$org$apache$log4j$Logger.Oscuro campo e modificatore in Log4j Logger

Dall'esame del codice byte, è chiaro che questo campo rappresenta la classe autoreferenziale da un momento in cui il pool costante non può ancora fare riferimento ai tipi. Quello che trovo strano è il modificatore di questo campo che è 0x41008 che indica un campo private, synthetic (che posso seguire) ma che aggiunge un modificatore 0x40000 che non riesco a trovare documentato da nessuna parte.

Da dove viene questo modificatore al bit 19 e che cosa esprime? (Log4j è compilato per Java 1).

+0

Non è il pool costante a cui non è possibile fare riferimento ai tipi, ma l'istruzione 'ldc' che non è stata in grado di caricare un riferimento come oggetto' Class' nella pila degli operandi. Ma il tipo di pool di cost costante di classe esisteva già per consentire di specificare il tipo 'this' e' super', implementare interfacce e dichiarare le classi di membri di riferimento. – Holger

risposta

6

javap è perfettamente contento di questo file di classe:

static java.lang.Class class$org$apache$log4j$Logger; 
    descriptor: Ljava/lang/Class; 
    flags: ACC_STATIC 
    Synthetic: true 

access_flags dovrebbero essere u2, che significa 2 byte senza segno. È strano vedere 0x41008, che è più grande di u2. Alcuni strumenti sono noti per memorizzare access_flags nei tipi più grandi, e iniettare bit ausiliari (ASM fa, JVM lo fanno, ecc) So che stai leggendo con ASM, quindi questo è probabilmente quello che si sta guardando:

org/ObjectWeb/asm/ClassReader.java:

 } else if ("Synthetic".equals(attrName)) { 
      access |= Opcodes.ACC_SYNTHETIC 
        | ClassWriter.ACC_SYNTHETIC_ATTRIBUTE; 

org/ObjectWeb/asm/ClassWriter.java:

/** 
* Pseudo access flag to distinguish between the synthetic attribute and the 
* synthetic access flag. 
*/ 
static final int ACC_SYNTHETIC_ATTRIBUTE = 0x40000; 

La domanda è: come fa trapelare a voi ...

+2

Si perde usando il plugin IntelliJs per leggere il codice byte che è basato su ASM e non su javap. Avrebbe dovuto fare affidamento sugli strumenti ufficiali. Grazie! –