スライドショー

【解決Java】クラス名とメソッド名を取得する方法

こんにちは!侍エンジニア インストラクターの本多です。

Javaのコーディングにおいて、実行したメソッド名やクラス名を取得したい、ということがよくあります。

Log4j等のデバッグツールを入れるとよいのはわかるが面倒!ちょっと知りたいだけなのに・・・という場合もありますよね。

この記事では、メソッド名やクラス名を取得する方法について

・スタックトレースとは何か?
・実行中のクラスからクラス名を取得する方法
・実行中のクラスからメソッド名を取得する方法

という基本的な内容から、

・スタックトレースからクラス名を取得する方法
・スタックトレースからメソッド名を取得する方法

といった応用的な内容に関しても解説していきます。

今回はメソッド名やクラス名を取得する方法について、使い方をわかりやすく解説します!

スタックトレースとは

私たちが書いたJavaのプログラムは、コンパイラによってJVM ( Java Vitrual Machine ) が理解できるバイナリコードに変換されます。

JVM は、バイナリコードをさらにOSが理解できるネイティブコードに変換します。

JVM が使うメモリ領域は、大きく分けてヒープ領域、スタック領域の2つがあります。

スタック領域には、クラスやメソッドの情報が入ります

通常、プログラムとは1つのクラス、1つのメソッドで目的を果たせることはほぼなく、クラスやメソッドが呼びに呼ばれて、、、となってようやく目的を果たせます。

クラスやメソッドが呼ばれるたびに、その情報がスタック領域に積み上がります

それが「スタックトレース」です。

JVM について、もっと知りたい方は以下をご覧ください。

【Java入門】JVMとは?わかりやすく解説!
更新日 : 2019年5月23日

クラス名を取得する方法

クラス名を取得する方法は2つあります。

実行中のクラス自身に記述して取得する方法と、スタックトレースから取得する方法です。

実行中のクラスから取得する方法

実行中のクラスからクラス名を取得する方法を、次のプログラムで確認してみましょう。

public class GetClassNameSample1 {
    
    public static void main(String[] args) {
      
        String className = new Object(){}.getClass().getName();
        System.out.println(className);
        
    }
    
}

実行結果:

GetClassNameSample1$1

この方法では、実行結果のように末尾に$1が入ります。

末尾の$1を消すためには、以下のようにしてください。

一部抜粋:

String className = new Object(){}.getClass().getEnclosingClass().getName();

実行結果:

GetClassNameSample1

スタックトレースから取得する方法

冒頭で説明したスタックトレースを使う方法です。

public class GetClassNameSample2 {
    
    public static void main(String[] args) {
      
        String className = Thread.currentThread().getStackTrace()[1].getClassName();
        System.out.println(className);
        
    }
    
}

実行結果:

GetClassNameSample2

getStackTrace() は、スタックの内容を配列で返します

よってインデックス番号を[1]と指定することにより、自身のクラス名を取得することが可能です。

ちなみに、0はThreadそのもののクラスjava.lang.Threadを返します

2を指定すると自身より下のスタックを探しに行きますが、まだ無いためArrayIndexOutOfBoundsExceptionの例外が発生します。

実行結果:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
        at GetClassNameSample2.main(GetClassNameSample2.java:5)

メソッド名を取得する方法

メソッド名も同様に、実行中のクラス内で取得する方法と、スタックトレースから取得する方法があります。

実行中のクラスから取得する方法

実行中のクラスからメソッド名を取得する方法を、次のプログラムで確認してみましょう。

public class GetMethodNameSample1 {
    
    public static void main(String[] args) {
      
        String methodName = new Object(){}.getClass().getEnclosingMethod().getName();
        System.out.println(methodName);
        
    }
    
}

実行結果:

main

部分的にclassからmethodに変えただけで完結します。

スタックトレースから取得する方法

これも基本的な考え方はクラスの時と同じです。

public class GetMethodNameSample2 {
    
    public static void main(String[] args) {
      
        String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();
        System.out.println(methodName);
        
    }
    
}

実行結果:

main

getStackTrace()[1]のインデックス番号を、0,1,2と変えるとどうなるでしょうか?

クラス名取得のときと同様、0ではgetStackTrace、1はmain、2のときはArrayIndexOutOfBoundsExceptionが発生します。

クラスについて詳しく知りたい方へ

クラスについては変数やメソッドを呼び出す方法や、クラスを継承する方法などのいろいろな使い方があります。

クラス中の変数やメソッドを呼び出す方法

クラスの中の変数やメソッドを呼び出す方法については次の記事にまとめているので、ぜひ確認してください!

【Java入門】クラスの使い方総まとめ
更新日 : 2019年7月24日

クラスを継承する方法

クラスを継承する方法については次の記事にまとめているので、ぜひ確認してください!

今からでも遅くない!クラスの継承(extends)を学ぼう!【Java】
更新日 : 2018年10月26日

メソッドについて詳しく知りたい方へ

この記事では紹介しきれなかったメソッドのいろいろな使い方を次の記事にまとめているので、ぜひ確認してください!

【Java入門】メソッドの使い方総まとめ(呼び出し、引数、戻り値)
更新日 : 2019年11月13日

まとめ

この記事では、クラス名とメソッド名を取得する方法について解説しました。

スタックトレースを理解するとデバッグに役立つのでぜひ覚えてください。

もし、クラス名とメソッド名を取得する方法を忘れてしまったら、この記事を思い出してくださいね!

LINEで送る
Pocket

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

本多 農

本多 農

関西在住のITエンジニアです。普通の会社に勤務しながら、侍エンジニアのインストラクター、ライターとして活動しています。