2013-01-05 18 views
11

Ben ilginç bir şey buldum. Basit sınıfın kurucularını ve değiştiricilerini almaya çalıştım.Beklenmeyen "geçici" yapıcı değiştirici

Class<?> clazz = Test.class; 
Constructor<?>[] ctors = clazz.getDeclaredConstructors(); 
for (Constructor<?> ctor : ctors) {   
    int mod = ctor.getModifiers(); 
    /*if not package-private modifier*/ 
    if(mod!=0) { 
     System.out.println(Modifier.toString(mod))); 
    } 
} 

sonucudur: Burada

public class Test { 
    public Test(Object... args) {} 
} 

yapıcı değiştiricileri almak için koddur

public transient 

Ben değişken parametreleri İmalatcı geçerseniz, ama sadece dizi tamam.

public class Test { 
    public Test(Object[] args) {} 
} 

sonucudur:

public 

aynı olursa olsun yapıcı modifiye olur (halka, korunmuş, özel) veya parametrelerin tipi (ilkel ya da referansları). "Geçici", kurucu için geçerli bir değiştirici değilken nasıl olabilir?

cevap

17

Erişim düzenleyiciler sınıf dosyasının içinde biraz maskeleri olarak kodlanmıştır. JVM spesifikasyonları, bir metot düzenleyici veya bir alan değiştiricisinde görünüp görünmediklerine bağlı olarak bazı bitlere farklı anlamlar atar. Bit 7 (0x0080) böyle bir bittir.

For methods

:

ACC_VARARGS 0x0080 Declared with variable number of arguments. 

For fields:

ACC_TRANSIENT 0x0080 Declared transient; not written or read by a persistent 
         object manager. 

bir yöntemle bakıyoruz için bu değiştirici doğru yorumu ACC_VARARGS değil ACC_TRANSIENT olduğunu.

Ancak Modifier sınıfı yalnızca JVM spec tanımlanan modifiye bir alt kümesi ile başa çıkabilecek görünür. Tek gereken tüm bir int olduğundan, ayrı ACC_VARARGS ve ACC_TRANSIENT söyleyemiyoruz bu.

+1

o 'toString' yönteminin bir hata olarak sayılır mı? –

+1

@JanDvorak: Emin değilim. Her şey bekledikçe, 'Değiştirici' sınıfı sadece JVM spesifikasyonlarında tanımlanan bir değiştirici alt kümesiyle (aynı bit değerine sahip olan modifiye ediciler arasında ayrım yapamadığından) çalışabilir. – NPE

+1

Merak ediyorum - neden gerçek değerler çarpışıyor? Bu JVM devlerinden bir gözetim değil mi? –