`

【转】 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 获取当前类名和方法名的实现方法是 Java 编程语言中一个重要的知识点。通过获取当前类名和方法名,可以帮助开发者更好地了解程序的执行流程, Debug 程序和优化代码性能...

    Android获取当前的Activity类名

    在Activity的代码内部,我们可以直接通过`this`关键字获取当前Activity的引用,然后调用`getClass().getName()`方法来获取类名。例如: ```java String currentActivityClassName = this.getClass().getName(); ...

    Java中获取当前函数名、类名、当前类的文件名.doc

    #### 二、获取当前类名 1. **使用`getClass()`方法** - 语法: `String clazz = this.getClass().getName();` - 解析: 这种方法利用了Java反射机制中的`getClass()`方法来获取当前对象所属类的信息,再通过调用`...

    Android获取当前运行的类名或者方法

    在Android开发中,有时我们需要获取当前正在执行的类名或方法名,这在调试、日志记录、性能分析等场景非常有用。以下是如何在Android应用中实现这一功能的详细步骤和相关知识点: 首先,Android系统提供了`...

    利用Java获取文件名、类名、方法名和行号的方法小结

    在Java编程中,有时我们需要获取当前执行代码的文件名、类名、方法名以及行号,这在调试、日志记录或异常处理等场景中非常有用。本篇文章将详细介绍如何利用Java内置机制来实现这些功能。 首先,Java通过`...

    自动获取android包名类名

    3. **获取包名**:要获取当前运行的应用的包名,可以使用`adb shell dumpsys package`命令。这会列出所有已安装应用的信息,包括包名。为了查找特定应用的包名,你可以对输出进行过滤,例如,如果你想知道应用ID为`...

    很好用的LOG封装,可同时输出类名,方法名,行数,可控制输出不输出

    1. **类名、方法名和行数的获取**:在Java中,`StackTraceElement`类提供了获取当前执行方法的详细信息。通过`Thread.currentThread().getStackTrace()`,我们可以得到一个`StackTraceElement`数组,从中可以获取到...

    java反射获取所有属性,获取所有get方法,包括子类父类

    在Java中,`java.lang.Class` 类提供了获取类属性的方法。要获取类的所有属性(包括public、private、protected以及默认访问权限的属性),可以使用以下代码: ```java Class<?> clazz = Class.forName("全限定...

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

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

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

    接下来,我们将在Java代码中实现获取当前Activity类名的逻辑。首先,你需要创建一个`ActivityManager`对象,它提供了获取设备上正在运行任务的信息。代码如下: ```java ActivityManager manager = ...

    Android查看当前栈应用顶包名和启动类名

    在Android开发中,有时我们需要获取当前栈顶应用的包名以及其启动的主类名,这对于调试、性能分析或者监控用户行为等场景非常有用。本文将详细介绍如何通过辅助功能服务和悬浮窗技术来实现这一目标。 首先,我们要...

    Java中通过Class类获取Class对象的方法详解

    "Java中通过Class类获取Class对象的方法详解" Java中获取Class对象是Java基础知识中的一个重要部分,通过Class类可以获取Class对象,Class对象是Java虚拟机在加载类时自动构造的。下面将详细介绍通过Class类获取...

    JAVA 开发之用静态方法返回类名的实例详解

    例如,Java标准库提供了一个静态方法`Class.forName("className")`,但这个方法需要传入类名作为字符串,而不是动态获取当前类名。 另一个更常见的方法是使用`Thread.currentThread().getStackTrace()`,它与异常...

    间接调用Log4j的日志功能导致类名输出错误解决方案

    在Log4j中,通常是通过`java.lang.StackTraceElement`来获取当前堆栈跟踪的类和方法信息。当通过间接调用(如自定义的日志工厂或包装器)来使用Log4j时,如果未正确处理,可能导致返回的类名是间接调用的类,而不是...

    java打印当前方法名示例分享

    总之,虽然Java不像C或C++那样提供直接的函数名访问,但是通过`Thread`或`Throwable`类,开发者可以间接地获取当前执行的方法名和类名。然而,使用这些方法时,需要注意潜在的性能影响,并根据具体环境进行适当的...

    android获取当前运行Activity名字的方法

    本篇文章将详细讲解两种在Android中获取当前运行Activity名字的方法。 首先,我们来看第一种方法,这种方法相对简单,但不适用于Service环境: ```java private String getRunningActivityName() { String ...

    Java 从网络中读取图片 转换成Base64字符串

    2. 打开连接:使用`openConnection()`方法获取`URLConnection`对象,然后调用其`connect()`方法建立连接。 ```java URLConnection connection = url.openConnection(); connection.connect(); ``` 3. 读取输入流:...

Global site tag (gtag.js) - Google Analytics