我有以下课程(注意方法是静态的):
class Base
{
public static void whosYourDaddy()
{
Class callerClass = // what should I write here to get caller class?
System.out.print(callerClass.getName());
}
}
Class A extends Base
{
public static void foo()
{
A.whosYourDaddy();
}
}
Class B extends Base
{
public static void bar()
{
B.whosYourDaddy();
}
}
当我打电话时:
A.foo();
B.bar();
我想获得输出:
AB
代替BaseBase
。甚至可以使用静态方法(在Java 7中)?
答案 0 :(得分:6)
你可以做什么,但不应该:)使用Throwable getStackTrace方法。除了气味,这是非常缓慢的,因为获得堆栈跟踪并不是那么快。但是你将获得一个StackTraceElement数组,每个都将包含调用它的类的类(你也可以获取文件和行,如果你将两者分开:你可以得到一个可点击的链接日食,不是说我曾做过这样的事情......)。
像
这样的东西String className = new Throwable().getStackTrace()[1].getClassName();
希望有所帮助:)
答案 1 :(得分: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; } }; }
答案 2 :(得分:-1)
是否可以使用静态方法(在Java 7中)?
不,静态方法不会被继承。仅继承非静态方法。
在您的情况下,更改Base
(和子类),如下所示:
class Base
{
public void whosYourDaddy()
{
Class<?> callerClass = getClass();
System.out.print(callerClass.getName());
}
}