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

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

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

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

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

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

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

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

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

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

なお、Javaの記事については、こちらにまとめています。

スタックトレースとは

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

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

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

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

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

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

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

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

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

【なかなかエラーが解決できない…そんな悩みを解決します!】

登録無料で始められるプログラミングスクール「侍テラコヤ」

・回答率100%のQ&A掲示板でエラーを解決!
現役エンジニアとのオンライン相談で悩みを解決!
・50種類以上の教材で複数言語を習得!

侍テラコヤについて詳しく見る

クラス名を取得する方法

クラス名を取得する方法は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が発生します。


【なかなかエラーが解決できない…そんな悩みを解決します!】

登録無料で始められるプログラミングスクール「侍テラコヤ」

・回答率100%のQ&A掲示板でエラーを解決!
現役エンジニアとのオンライン相談で悩みを解決!
・50種類以上の教材で複数言語を習得!

侍テラコヤについて詳しく見る

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

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

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

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

【Java入門】クラスの使い方総まとめ
更新日:2023年3月21日

クラスを継承する方法

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

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

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

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

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

まとめ

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

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

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

プログラミング学習中、
誰かへ相談したいことはありませんか?

SAMURAI TERAKOYA

プログラミングはエラーの連続。作業を進めるなかで誰かに教えてほしい場面は多いですよね。

そんな悩みを解決できるのが、侍テラコヤです。登録無料で始められて、現役エンジニアとオンラインで相談できるほか、回答率100%のQA掲示版でプログラミングに関する悩みを解決します!

気になる方はぜひ詳細をご覧ください。

→侍テラコヤの詳細をみる

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

あなたの目的に合わせた
SAMURAI ENGINEERの運営サービス

SAMURAI ENGINEER Pro

未経験でも挫折しないプログラミングスクール

詳細はこちら

SAMURAI TERAKOYA

日本最大級のサブスク型オンラインITスクール

詳細はこちら

SAMURAI ENGINEER Freelance

「一人で稼げる」スキルを身につける

詳細はこちら
Close