2016-04-14 19 views
8

org.apache.log4j.Logger için sınıf dosyasına bakıldığında, class$org$apache$log4j$Logger adıyla Class türünde bir sentetik alan tanımlar.Log4j Logger 0'da görülebilir alan ve değiştirici

Bayt koduna bakmadan, bu alanın sabit havuzun henüz referans türlerini kullanamadığı bir zaman aralığındaki kendinden başvurulan sınıfı temsil ettiği açıktır. Ancak garip buluyorum bu alanın 0x41008 olan ve private, synthetic alanını (izleyebileceğimi) gösteren değiştiricidir ama bu, herhangi bir yerde bulunamadığım bir değiştirici 0x40000 ekler.

Bu değiştiricinin 19 bitindeki nereden geldiği ve neyi ifade ettiği? (Log4j Java 1 için derlenmiştir).

+0

Türleri referans veremeyen sabit havuz değil, "Class" nesnesi işlenen yığınına böyle bir başvuru yüklenemeyen "ldc" komutu. Ancak, "bu" ve "süper" türlerini, uygulanan arabirimleri ve başvurulan üyelerin sınıflarını bildirmeye izin vermek için sınıf sabit havuzu türü zaten mevcuttu. – Holger

cevap

6

javap o sınıf dosyası ile mükemmel mutlu:

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

access_flags 2 bayt işaretsiz yani u2 olması gerekiyordu. u2'dan daha büyük olan 0x41008'u görmek şaşırtıcıdır. Bazı araçların access_flags'ı daha büyük tipte depoladığı ve yardımcı bitleri enjekte ettiği bilinir (ASM bunu yapar, JVM'ler yapar, vb.) ASM ile okuduğunuzu biliyorum, bu yüzden muhtemelen şu an ne görüyorsunuz:

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; 

soru, size sızıntı yok nasıl ...

+2

javap değil ASM üzerine dayalı bayt kodu okumak için IntelliJs eklentisini kullanarak sızdırıyor. Resmi takımlara güvenmeliydim. Teşekkürler! –