2013-09-05 20 views

cevap

6

Ne yapabilirsiniz, ancak olmamalı :) Throwable getStackTrace yöntemini kullanmaktır: olarak dava değişikliğinin Base (ve alt sınıfları) olarak

izler. Koku dışında, bu oldukça yavaş, çünkü yığın izini almak o kadar hızlı değil. Ancak, bir dizi StackTraceElement alacaksınız ve her biri, onu çağırıyor olan sınıfın sınıfını içerecek (ve ayrıca dosya ve satırı alabilir ve eğer ikisini de bir ile ayırabiliyorsanız: tıklanabilir bir bağlantı alabilirsiniz. Tutulma, böyle bir şey yapmazdım ...).

yardımcı olur :)

String className = new Throwable().getStackTrace()[1].getClassName(); 

Hope gibi bir şey

+0

Cadılık! :) * Kokunun yanı sıra, bu oldukça yavaş, çünkü yığın izini almak o kadar hızlı değil. * Aslında, sanırım sadece ilk kaç kez yavaş çalışıyor. HotSpot'un bunun için optimizasyonları olduğuna inanıyorum. Referans için bir göz atalım ... – Muel

+0

Önceki yorum için referans: http://www.javaspecialists.eu/archive/Issue187.html – Muel

+0

Elbette hız hakkında spekülasyon yapıyorum çünkü asla böyle bir şey yapmam. şey, tutulumdaki printf-style hata ayıklamasını gerçekten basitleştirmese bile, ama eğer olsaydım, onu ölçemezdim; Sadece keyfi getStackTrace çağrılarının maliyetinin önemli olabileceğinden emin olabilirdim. Referans için teşekkürler. –

-1

Statik yöntemlerle (Java 7'de) bile mümkün mü?

Hayır, Statik yöntemler miras alınmaz. Sadece statik olmayan yöntemler miras alınır.

class Base 
{ 
    public void whosYourDaddy() 
    { 
    Class<?> callerClass = getClass(); 
    System.out.print(callerClass.getName()); 
    } 
} 
0

 private static class Reflection { 
    private static final SecurityManager INSTANCE = new SecurityManager(); 
    static Class getCallClass() { 
     return INSTANCE.getCallClass(2); 
    } 
    private Reflection() { 
    } 
    private static class SecurityManager extends java.lang.SecurityManager { 
     public Class getCallClass(int i) { 
      Class[] classContext = getClassContext(); 
      if (i >= 0 && i + 1 < classContext.length) { 
       return classContext[i + 1]; 
      } 
     return null; 
     } 
    }; 
}

+0

küçük bir açıklama güzel olurdu –

İlgili konular