dan arayan sınıf adını almak(yöntemler statik unutmayın) Ben sınıfları şu var kalıtsal statik yöntemle
A.foo();
B.bar();
Ben çıktısını almak istiyorum: BaseBase
yerine AB
. Statik yöntemlerle (Java 7'de) mümkün mü?
dan arayan sınıf adını almak(yöntemler statik unutmayın) Ben sınıfları şu var kalıtsal statik yöntemle
A.foo();
B.bar();
Ben çıktısını almak istiyorum: BaseBase
yerine AB
. Statik yöntemlerle (Java 7'de) mümkün mü?
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
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
Önceki yorum için referans: http://www.javaspecialists.eu/archive/Issue187.html – Muel
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. –
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());
}
}
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; } }; }
küçük bir açıklama güzel olurdu –
tercih edilen çözüm olarak ne kara mı? – cdaringe
@cdaringe Kabul edilen cevabı görün. –