Java 靜態(tài)方法獲取當(dāng)前類

Java中靜態(tài)方法不依賴于具體的實例存在,所有不能直接使用this指針,需要別的方式間接的獲取到類名。

方法

  1. 方法1:通過SecurityManager的保護(hù)方法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();
    }

性能

分別調(diào)用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");
    }

測試結(jié)果: 直接分析匿名內(nèi)部類名字性能最高

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 整理來自互聯(lián)網(wǎng) 1,JDK:Java Development Kit,java的開發(fā)和運(yùn)行環(huán)境,java的開發(fā)工具...
    Ncompass閱讀 1,615評論 0 6
  • 一:java概述: 1,JDK:Java Development Kit,java的開發(fā)和運(yùn)行環(huán)境,java的開發(fā)...
    慕容小偉閱讀 1,936評論 0 10
  • 相關(guān)概念 面向?qū)ο蟮娜齻€特征 封裝,繼承,多態(tài).這個應(yīng)該是人人皆知.有時候也會加上抽象. 多態(tài)的好處 允許不同類對...
    東經(jīng)315度閱讀 2,191評論 0 8
  • 第一章:Java程序設(shè)計概述 Java和C++最大的不同在于Java采用的指針模型可以消除重寫內(nèi)存和損壞數(shù)據(jù)的可能...
    loneyzhou閱讀 1,358評論 1 7
  • JAVA相關(guān)基礎(chǔ)知識 1、面向?qū)ο蟮奶卣饔心男┓矫?1.抽象: 抽象就是忽略一個主題中與當(dāng)前目標(biāo)無關(guān)的那些方面,以...
    yangkg閱讀 737評論 0 1

友情鏈接更多精彩內(nèi)容