Java中获取当前类名,方法名等

本文详细解析了Java中获取当前函数名、类名、当前类的文件名的多种方法,包括使用getClass()、Thread.currentThread().getStackTrace()等API,并对比了它们的性能差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!--本文非原创,摘自百度文库的中richardtxws贡献者,完善了里面的内容-->

Java获取当前函数名类名当前类的文件名

方法一:getClass()

获取当前类名:String clazz = this.getClass().getName();

方法二(JDK 5):Thread.currentThread()

JDK 5中,有三个类拥有getStackTrace方法,

返回 方法 注释

ThreadStackTraceElement[]        getStackTrace()    返回一个标示该线程堆栈转储的堆栈跟踪元素数组

ThreadInfoStackTraceElement[] getStackTrace() 返回与此ThreadInfo相关的现成的堆栈跟踪

ThrowableStackTraceElement[]getStackTrace() 提供编程访问由printStackTrace()输出的堆栈跟踪信息

此处,我们用Thread.currentThread()中的StackTraceElement来获取当前函数名。在MainApplication.java中的Main方法中测试,具体代码如下:

1. 获取当前函数名:Thread.currentThread().getStackTrace()[1].getMethodName(); 得到 main

2. 获取当前类名:Thread.currentThread().getStackTrace()[1].getClassName(); 得到mainapplication.MainApplication

3. 获取当前类的文件名:Thread.currentThread().getStackTrace()[1].getFileName();  得到MainApplication.java

方法三:可在静态方法使用

静态方法不与特定实例关联,不能引用this,要得到当前类名,没有直接的办法。

通过查资料和试验,可以用下面几种方式:

//方法1:通过SecurityManager的保护方法getClassContext()

    public static void main(String[] args) {
        String  name = new SecurityManager(){
            public String getClassName(){
                return this.getClassContext()[1].getName();
            }
        }.getClassName();
        System.out.println(name);
    }


//方法2:通过Throwable的方法getStackTrace()

    public static void main(String[] args) {
        String  name = new Throwable().getStackTrace()[0].getClassName();
        System.out.println(name);
    }


</pre><p></p><p><span style="color:rgb(255,0,0)"><span style="font-size:14px">//<span style="font-family:宋体">方法</span><span style="font-family:Times New Roman">3</span><span style="font-family:宋体">:通过分析匿名类名称</span><span style="font-family:Times New Roman">()</span></span></span></p><p></p><pre name="code" class="java">    public static void main(String[] args) {
        String  name = new Object(){
            public String getClassName(){
                return this.getClass().getName().replaceFirst("[$][1]", "");
            }
        }.getClassName();
        System.out.println(name);
    }


分别调用10万次,

    方法1219ms

    方法2953ms

    方法331ms

比较:

    1)方法1不知有没有什么使用限制?

    2)方法2通过异常机制获取调用栈,性能最差,但能提供其它方法所不具有的功能,还可以获取方法名,行号等等;但这么使用多少有点不太常规;

    3)方法3只是简单分析了一下匿名类的名称,显然要简单多,事实上性能也是最高的;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值