我想获取方法的调用者类,即
class foo{ bar(); }
在方法栏中,我需要获取类名称foo,然后找到了该方法:
foo
Class clazz = sun.reflect.Reflection.getCallerClass(1);
但是,即使getCallerClass是public,当我尝试调用它时,Eclipse 也会说:
getCallerClass
public
访问限制:由于必需的库C:\ Program Files \ Java \ jre7 \ lib \ rt.jar的限制,无法访问类型为Reflection的方法getCallerClass()
还有其他选择吗?
你可以生成堆栈跟踪并使用StackTraceElements中的信息。
例如,实用程序类可以为你返回调用类名称:
public class KDebug { public static String getCallerClassName() { StackTraceElement[] stElements = Thread.currentThread().getStackTrace(); for (int i=1; i<stElements.length; i++) { StackTraceElement ste = stElements[i]; if (!ste.getClassName().equals(KDebug.class.getName()) && ste.getClassName().indexOf("java.lang.Thread")!=0) { return ste.getClassName(); } } return null; } }
如果你调用KDebug.getCallerClassName()从bar(),你会得到"foo"。
KDebug.getCallerClassName()
bar()
到"foo"
现在假设你想知道方法调用的类bar(这会更有趣,也许你真正想要的是)。你可以使用以下方法:
bar
public static String getCallerCallerClassName() { StackTraceElement[] stElements = Thread.currentThread().getStackTrace(); String callerClassName = null; for (int i=1; i<stElements.length; i++) { StackTraceElement ste = stElements[i]; if (!ste.getClassName().equals(KDebug.class.getName())&& ste.getClassName().indexOf("java.lang.Thread")!=0) { if (callerClassName==null) { callerClassName = ste.getClassName(); } else if (!callerClassName.equals(ste.getClassName())) { return ste.getClassName(); } } } return null; }
这是用于调试吗?如果没有,可能有一个更好的解决方案。