Javaプログラムを開発する際、実行中のクラス名やメソッド名を取得したいことはありませんか?
本記事では、Javaでクラス名やメソッド名を出来るだけ簡単に取得する方法について、サンプルコードを掲載しながら解説していきます。
クラス名とメソッド名の取得方法
Javaではクラス名とメソッド名の取得方法として「実行中のクラスから取得」と「スタックトレースから取得」する2種類の方法が利用出来ます。
実行中のクラスから取得
実行中のクラスからクラス名を取得するには下記の下記「getName」メソッドを利用することで取得することが可能です。
new Object(){}.getClass().getEnclosingClass().getName()
メソッド名を取得する場合は「getEnclosingMethod」を利用して下記のように記述します。
new Object(){}.getClass().getEnclosingMethod().getName()
スタックトレースから取得
クラス名をスタックトレースから取得する場合、Threadクラスから「getClassName」メソッドを利用することが出来ます。
Thread.currentThread().getStackTrace()[1].getClassName()
メソッド名を取得する場合、「getClassName」メソッドを「getMethodName」メソッドに変更します。
Thread.currentThread().getStackTrace()[1].getMethodName()
クラス名とメソッド名の取得サンプル
実行中のクラスから取得する方法とスタックトレースから取得する方法をご紹介したので、実際にサンプルコードで確認していきましょう。
クラス名を実行中クラスから取得する
package sample; public class Main { public static void main(String[] args) { Sub sub = new Sub(); sub.execute(); System.out.println(new Object(){}.getClass().getEnclosingClass().getName()); } } class Sub { public void execute() { System.out.println(new Object(){}.getClass().getEnclosingClass().getName()); } }
実行結果は下記です。
sample.Sub sample.Main
8行目と15行目でそれぞれクラス名をコンソール出力していますが、実行されているクラスにより出力内容が変わっていることをご確認頂けます。
メソッド名を実行中クラスから取得する
package sample; public class Main { public static void main(String[] args) { Sub sub = new Sub(); sub.execute(); System.out.println(new Object(){}.getClass().getEnclosingMethod().getName()); } } class Sub { public void execute() { System.out.println(new Object(){}.getClass().getEnclosingMethod().getName()); } }
実行結果が下記です。
execute main
「getEnclosingMethod」を利用することで、メソッド名を取得することが出来ます。
8行目、15行目のコンソール出力結果からそれぞれのメソッドが取得出来ていることが確認出来ます。
クラス名をスタックトレースから取得する
package sample; public class Main { public static void main(String[] args) { Sub sub = new Sub(); sub.execute(); System.out.println(Thread.currentThread().getStackTrace()[1].getClassName() ); } } class Sub { public void execute() { System.out.println(Thread.currentThread().getStackTrace()[1].getClassName() ); } }
実行結果が下記です。
sample.Sub sample.Main
ちなみに「getStackTrace()[1]」の部分を「getStackTrace()[2]」にすると呼び出し元のクラスが取得出来ます。
package sample; public class Main { public static void main(String[] args) { Sub sub = new Sub(); sub.execute(); System.out.println(Thread.currentThread().getStackTrace()[1].getClassName() ); } } class Sub { public void execute() { System.out.println(Thread.currentThread().getStackTrace()[2].getClassName() ); } }
実行結果が下記です。
sample.Main sample.Main
メソッド名をスタックトレースから取得する
package sample; public class Main { public static void main(String[] args) { Sub sub = new Sub(); sub.execute(); System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()); } } class Sub { public void execute() { System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()); } }
実行結果が下記です。
execute main
「getStackTrace()[2]」に変更することで、クラス名と同じく呼び出し元のメソッド名を取得出来ます。
さいごに: クラス名とメソッド名の取得は標準APIだけで出来る
本記事では、クラス名とメソッド名の取得方法をご紹介してきました。
クラス名とメソッド名は大きく「実行中のクラスから取得する方法」と「スタックトレースから取得する方法」の2種類の方法が利用可能です。
どちらもJava標準APIだけで出来る方法ですので、クラス名やメソッド名を取得したい際にはぜひ活用してみてください。
mainメソッドから出力している8行目で「getStackTrace()[2]」に設定すると、呼び出し元となるメソッドが存在しないためエラーとなるので注意が必要です。