Java 静态方法获取当前类

Java中静态方法不依赖于具体的实例存在,所有不能直接使用this指针,需要别的方式间接的获取到类名。

方法

  1. 方法1:通过SecurityManager的保护方法getClassContext()
private static String test1() {
        return new SecurityManager() {
            public String getClassName() {
                return getClassContext()[1].getName();
            }
        }.getClassName();
    }
  1. 方法2:通过Throwable的方法getStackTrace()
private static String test2() {
        return new Throwable().getStackTrace()[1].getClassName();
    }
  1. 方法3:通过Thread.currentThread的方法getStackTrace()
private static String test3() {
        return Thread.currentThread().getStackTrace()[1].getClassName();
    }
  1. 方法4:通过分析匿名类名称()
private static String test4() {
        return new Object() {
            public String getClassName() {
                String clazzName = this.getClass().getName();
                return clazzName.substring(0, clazzName.lastIndexOf('$'));
            }
        }.getClassName();
    }

性能

分别调用100w次测试性能

public static void main(String[] args) {
        long start, end;
        int total = 1000000;
        String className = null;

        start = System.currentTimeMillis();
        for (int i = 0; i < total; i++) {
            className = Main.test1();
        }
        end = System.currentTimeMillis();
        System.out.println("test1: " + className + "time: " + (end - start) + " ms");

        start = System.currentTimeMillis();
        for (int i = 0; i < total; i++) {
            Main.test2();
        }
        end = System.currentTimeMillis();
        System.out.println("test2: " + className + "time: " + (end - start) + " ms");

        start = System.currentTimeMillis();
        for (int i = 0; i < total; i++) {
            Main.test3();
        }
        end = System.currentTimeMillis();
        System.out.println("test3: " + className + "time: " + (end - start) + " ms");

        start = System.currentTimeMillis();
        for (int i = 0; i < total; i++) {
            Main.test4();
        }
        end = System.currentTimeMillis();
        System.out.println("test4: " + className + "time: " + (end - start) + " ms");
    }

测试结果: 直接分析匿名内部类名字性能最高

test1: com.rainlf.mult.Maintime: 463 ms
test2: com.rainlf.mult.Maintime: 1840 ms
test3: com.rainlf.mult.Maintime: 2193 ms
test4: com.rainlf.mult.Maintime: 21 ms
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 整理来自互联网 1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具...
    Ncompass阅读 1,555评论 0 6
  • 一:java概述: 1,JDK:Java Development Kit,java的开发和运行环境,java的开发...
    慕容小伟阅读 1,844评论 0 10
  • 相关概念 面向对象的三个特征 封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象. 多态的好处 允许不同类对...
    东经315度阅读 2,005评论 0 8
  • 第一章:Java程序设计概述 Java和C++最大的不同在于Java采用的指针模型可以消除重写内存和损坏数据的可能...
    loneyzhou阅读 1,287评论 1 7
  • JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以...
    yangkg阅读 678评论 0 1