2010-10-25 76 views

回答

9

this.getClass()=当前类
this.getClass()。getPackage()=当前包
Class.getName()=类名
Package.getName()=包名称的字符串的字符串

我相信你正在寻找Reflection API以获得相当于自省(http://download.oracle.com/javase/tutorial/reflect/)。

4

@克里斯托弗的答案解决了类名的问题。

AFAIK,标准的Java类库没有提供直接的方法来获取对象类的文件名。

如果类是用适当的“-g”选项设置编译,你可以潜在得到的类文件名间接如下:

  • 中的类中的方法之一,创建异常对象。
  • 使用Throwable.getStackTrace()获取异常的堆栈跟踪信息。
  • 获取当前方法的堆栈跟踪元素,并使用StackTraceElement.getFilename()来获取源文件名。

请注意,这可能很昂贵,并且不能保证文件名将被返回,或者它将成为您期望的文件名。

+0

我一时举不出我这个源,但我确实记得,如果你决定做这样的事情(并且请保持它不在生产级代码中),你可以通过使用本地异常(例如NullPointerException)来加速它,而不是简单地构建你自己的,因为native例外已被缓存(对原作者'部分)。 IE:try {Object o; o.toString(); } catch(NullPointerException e){}比尝试更快{throw new Exception(“foo”)} catch(Exception e){} – cwallenpoole 2010-10-26 01:19:04

+1

这是行不通的。该异常需要以正常的方式实例化,以允许您捕获当前上下文的堆栈跟踪信息。不管你是简单地构造它还是做一些事情来构建JVM构造都没有什么不同。 (事实上​​,我怀疑后者实际上会比较慢,因为必须抛出异常并将其捕获。) – 2010-10-26 02:16:05

3

你可以得到(不含包)包含类文件的文件夹:

SomeClass.class.getProtectionDomain().getCodeSource().getLocation().toExternalForm(); 
1

您可以使用反射来浏览堆栈跟踪:

new Throwable().getStackTrace()[1].getFileName() 
new Throwable().getStackTrace()[1].getClassName() 
new Throwable().getStackTrace()[1].getMethodName() 
new Throwable().getStackTrace()[1].getLineNumber() 
相关问题