`

【转】 Java获取当前类名、方法名

 
阅读更多

原帖来自于: http://blog.csdn.net/a578559967/article/details/7688971

 

为了测试各个函数,如果手动打印每个类名、函数名,那么多函数的话能把人累死,Java早已准备好了一堆记录自身的函数。

 

获取类名:

 

    public static void testGetClassName() {  
        // 方法1:通过SecurityManager的保护方法getClassContext()  
        String clazzName = new SecurityManager() {  
            public String getClassName() {  
                return getClassContext()[1].getName();  
            }  
        }.getClassName();  
        System.out.println(clazzName);  
        // 方法2:通过Throwable的方法getStackTrace()  
        String clazzName2 = new Throwable().getStackTrace()[1].getClassName();  
        System.out.println(clazzName2);  
        // 方法3:通过分析匿名类名称()  
        String clazzName3 = new Object() {  
            public String getClassName() {  
                String clazzName = this.getClass().getName();  
                return clazzName.substring(0, clazzName.lastIndexOf('$'));  
            }  
        }.getClassName();  
        System.out.println(clazzName3);  
        //方法4:通过Thread的方法getStackTrace()  
        String clazzName4 = Thread.currentThread().getStackTrace()[2].getClassName();  
        System.out.println(clazzName4);  
    }  

 PS: 这边解释下方法二的数组 stackTrace就是调用栈 为什么用的是1呢? 因为0表示当前的调用栈(也就是testGetClassName 本身 1是调用这个方法的方法 也就是我们需要判断的方法(类)) 方法4用的2是因为 1是getStackTrace这个方法本身 其他的顺延后移了一位 

 

执行100w次,

第一种方法:1718ms

第二种方法:4843ms

第三种方法:47ms

第四种方法:6484ms

比较:
    1)方法1不知有没有什么使用限制?
    2)方法2通过异常机制获取调用栈,性能最差,但能提供其它方法所不具有的功能,还可以获取方法名,行号等等;但这么使用多少有点不太常规;
    3)方法3只是简单分析了一下匿名类的名称,显然要简单多,事实上性能也是最高的;

    4)方法4感觉和方法3有点类似,比方法3正规了点

获取函数名:

    public static void testGetFunctionName() {  
            // 方法1:通过Throwable的方法getStackTrace()  
            String funcName2 = new Throwable().getStackTrace()[1].getMethodName();  
            System.out.println(funcName2);  
            //方法2:通过Thread的方法getStackTrace()  
            String clazzName4 = Thread.currentThread().getStackTrace()[2].getMethodName();  
            System.out.println(clazzName4);   
        }  

 执行100w次:

第一种:4856ms

第二种:6337ms

 

说明:

1.Exception类继承于Throwable,所以有的地方用Exception调用那个getStackTrace,其实调用的还是Throwable的

2.不同的jdk版本调用getStackTrace后得到的数组不太一样,下标多试几次就知道了,以上是jdk1.6版本下的

 

原文来自于:

http://blog.csdn.net/a578559967/article/details/7688971

 

分享到:
评论

相关推荐

    Java 获取当前类名和方法名的实现方法

    主要介绍了 Java 获取当前类名和方法名的实现方法的相关资料,这里不仅提供了实现方法并比较几种方法的效率,需要的朋友可以参考下

    java 遍历指定包下所有类,返回完整类名。工具类,可以直接拷入使用

    资源分数必须最少填1,不好意思。如果没有积分可以去git链接下载,本人博客有git地址。博客地址:... java 遍历指定包下所有类,返回完整类名。工具类,可以直接拷入使用。

    Android获得当前正在显示的activity类名的方法

    本文实例讲述了Android获得当前正在显示的activity类名的方法。分享给大家供大家参考。具体实现方法如下: 首先需要加一个权限: 代码如下:”android.permission.GET_TASKS”/> Java代码如下: 代码如下:...

    java 面试题 总结

    java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,...

    LogApp:关于Android日志处理

    AS点击方法名自动跳转 Json格式自动解析打印 xml格式自定解析打印 Log信息存储到文件(6.0以上需要动态申请存储空间权限) 变长参数打印 无logcat最多4000字符打印限制 Features Can use ToolLog.d() with no tag ...

    基于某JAVA地剪刀石头布游戏设计——Java课程设计报告材料-.doc

    游戏程序框图如图1所示: 图1 游戏程序框图 2.4 JAVA类与自定义类相互继承的层次关系 2.4.1 Java类与自定义类的说明 自定义类: 类名:SocketServer 作用:服务器类 继承的父类:Thread类 实现的接口:无 类名:Service ...

    day021-反射和注解笔记和代码.rar

    String getName() 获取全限定类名(全限定,包含包名) Class类中方法 String getSimpleName() 获取类名简称 Class类中方法 Package getPackage() 获取包名 Class类中方法 T newInstance() ...

    Android开发人员不得不收集的代码

    getAppPackageName : 获取 App 包名 getAppDetailsSettings: 获取 App 具体设置 getAppName : 获取 App 名称 getAppIcon : 获取 App 图标 getAppPath : 获取 App 路径 getAppVersionName : 获取 App 版本号 getApp...

    安卓java获取webview源码-3DSView:AndroidUI组件,用于处理Android应用程序中的银行3DSecure(Maste

    安卓java获取webview源码3DSView (D3SView :) ,又名 3D Secure WebView 用于处理 Android 应用程序中银行 3D Secure(MasterCard SecureCode / Verified By Visa)支付授权的独立 UI 组件。 为什么是“D3S”? 仅仅...

    Java 2实用教程(第三版)实验指导与习题解答

    Java 2实用教程(第三版)实验指导与习题解答 清华大学出版社 (编著 耿祥义 张跃平) 实验模版代码 建议使用文档结构图 (选择Word菜单→视图→文档结构图) 上机实践1 初识Java 4 实验1 一个简单的应用程序 ...

    genrator生成java注释

    至此oracle、mysql mybatis-generator自动生成代码(含中文注释) 1、打开generatorConfig.xml ...3、修改生成Model类存放位置,生成对应的bean 根据项目的具体对象的存放位置修改target... 即可在src下面获取到对应的文件

    day020-继承加强和设计模式代码和笔记.rar

    //获取当前线程类加载器 2、InputStream is = classLoader.getResourceAsStream("文件路径/文件名");//通过当前线程的类加载器获取流对象,如果是源文件夹,直接文件名 建议用当前线程类的加载器方式...

    Java面试宝典(传说中的葵花宝典).doc

    4、在JAVA中如何跳出当前的多重嵌套循环? 在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。例如, ok: for(int i=0;i;i...

    超级有影响力霸气的Java面试题大全文档

    1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是...

    张孝祥java就业面试宝典

    4、在JAVA中如何跳出当前的多重嵌套循环? 在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。例如, ok: for(int i=0...

    【05-面向对象(下)】

    •Java 7为所有包装类增加一个新方法: compare(x , y)的方法。该方法用于比较两个包装类实例,当x>y, 返回大于0的数;当x==y,返回0;否则返回小于0的数。 对象的方法 •打印对象和toString方法:...

    Android代码-基于Xposed Framewrok的动态逆向分析模块

    1、获取APK当前加载DEX文件信息: adb shell am broadcast -a com.zjdroid.invoke --ei target pid --es cmd '{"action":"dump_dexinfo"}' 2、获取指定DEX文件包含可加载类名: adb shell am broadcast -a ...

    定义一个Book类,实现简单操作实验报告

    定义一个Book类,在该类定义中包括: ...borrow()将存书数量减1,并显示当前存书量;restore()将存书量加1,并显示当前存书量。 (3)在main函数中,要求建立某一种图书对象,并对该书进行简单的显示、借阅和归还处理。

    mybatis-generator自动生成代码(含中文注释)

    mybatis-generator自动生成代码(含中文注释) 1、打开generatorConfig.xml ...3、修改生成Model类存放位置,生成对应的bean 根据项目的具体对象的存放位置修改targetPackage的值 ... 即可在src下面获取到对应的文件

Global site tag (gtag.js) - Google Analytics