2008-11-12 18 views
8

Öyle gibi statik bir yöntemle bir Java sınıf var olduğunu varsayalım:Statik yöntemimi hangi sınıf başlattı?

 
class B extends A { } 
class C extends A { } 
class D extends A { } 
... 

Şimdi aşağıdaki yöntemi çağırmaları göz önünde bulundurun:

 
class A 
{ 
    static void foo() 
    { 
     // Which class invoked me? 
    } 
} 

Ve varsayalım ayrıca o A sınıfı alt sınıflarından keyfi bir numarası vardır :

 
A.foo(); 
B.foo(); 
C.foo(); 
D.foo(); 
... 

sorum, nasıl bir yöntem bunu çağırma hangi sınıf anlatmak foo() olabilir mi?

cevap

10

Bu, statik yöntemlerle sorunun bir parçası olamaz. Derleyici söz konusu olduğunda, A.foo() ve B.foo() tam olarak aynı şeydir. Aslında, aynı bayt kodunu derlerler. Bundan daha fazlasını elde edemezsin.

Bu tür bilgilere gerçekten ihtiyacınız varsa, bir tekil kullanın ve foo()'u örnek yöntemine dönüştürün. Statik sözdizimini hala seviyorsanız, A.foo() bir cephe oluşturabilirsiniz.

static void foo() 
{ 
    Throwable t = new Throwable(); 
    StackTraceElement[] trace = t.getStackTrace(); 
    String className = trace[1].getClassName(); 
    Class whoCalledMe = null; 
    try 
    { 
     whoCalledMe = Class.forName(className); 
    } 
    catch(Exception e) 
    { 
    } 
} 

I: Statik yöntem üzerinde çağrıldığı sınıf bulamıyor rağmen

3
class A 
{ 
    static void foo(A whoIsCalingMe) 
    { 
     // Which class invoked me? 
    } 
} 
4

, aslında zamanında yöntem çağrıldığında hangi sınıf öğrenmek mümkündür Bunun iyi bir uygulama olduğunu ve muhtemelen bir performans açısından büyük olmadığını söylemiyorum ama işe yaramalı. Bu herhangi bir yardımcı olur mu bilmiyorum ...

+0

Yuck. İşe yarıyor; ama IIRC'nin yansıması, bu tür şeyleri cesaretlendirmek için kasten yapılmıştı. – jamesh

+0

Statik bir yardımcı program metodu 'trace (String s)' yazmak için bir yol arıyordum, eğer Foo sınıfındaki bir metod 'trace (" hi ")' yi çağırırsa, SYSOUT'a yazacaktır: ** Foo: hi **. Bu hile yapmak gibi görünüyor. – Chap

İlgili konular