オーダーメイドコース
icon
icon

Javaでクラス名を取得する方法 【初心者向け】

初心者向けにJavaでクラス名を取得する方法について解説しています。クラス名はソースファイル名とも関わりがあります。クラス名について理解しておかないと、プログラムが正しく動作しないことがあります。クラス名の仕組みと取得の方法について学習しましょう。

テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日  調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名  調査手法:インターネット調査

この記事では、Javaでクラス名を取得する方法について解説します。

実際にプログラムを書いて説明しているので、ぜひ理解しておきましょう。

 

そもそもJavaについてよく分からないという方は、Javaとは何なのか解説した記事を読むとさらに理解が深まります。
 

なお本記事は、TechAcademyのオンラインブートキャンプJava講座の内容をもとに作成しています。

 

田島悠介

今回は、Javaに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

クラス名を取得する方法について詳しく説明していくね!

大石ゆかり

お願いします!

 

クラス名とは

クラス名とは、そのままクラスの名前を意味します。

クラスを作成する際には必ずそのクラスに名前を付ける必要があります。

Javaプログラムでは名前で各クラスを識別しており、対象のクラス名を指定することで内容にアクセスできます。

Eclipseを利用してクラスの作成を行うと、クラスと同名のソースファイル(xxx.java)が自動的に作成されるかと思いますが、これはクラス名とソースファイル名が一致していなければならないという制約があるからです。

どちらかの名前を変更した場合は必ずもう一方も合わせる様にして下さい。クラス名は基本的に重複できません。それぞれ固有の名前を付けて下さい。

ただし、パッケージが異なる場合は既に在るクラスと同じ名前を付けることが可能です。

 

クラス名を取得する方法

例えば実行時のログ出力処理において、その処理を行なっているクラスをログ内容に含めたいとします。

もちろん、クラス名をそのまま直接出力することはできますが、その場合各クラス毎に別々の処理を書かなければなりません。

(例)

log(“AAAクラスで実行”);

上記の例だと仮にBBBクラスに書く場合は”BBBクラスで..”と内容を変える必要があります。

しかし、実行中のクラス名を動的に取得すれば各クラスで書く処理を同じにできます。

(例)

log(「実行中クラス名」+ ”クラスで実行”);

上記の例だとAAAクラスなら「AAAクラスで..」、BBBクラスなら「BBBクラスで..」とそれぞれに合わせた内容が自動的に出力できます。

クラス名を取得する方法はいくつか有りますが、ここではスタックトレースを利用する方法を紹介します。

スタックトレースとはいわば処理の流れの記録の様なものです。Java仮想マシンにはクラスやメソッドを呼ぶ度にスタックという領域にそれらの情報を記録する仕組みがあり、その情報の蓄積がスタックトレースです。

下記はスタックトレースを利用してクラス名を取得、出力するコードの例です。

(例)

System.out.println(Thread.currentThread().getStackTrace()[1].getClassName());

Thread.currentThread( ).getStackTrace( )で現在処理している場所までのスタックトレースを配列で得られます。

配列の要素に1を指定しているのは先頭0番目にはこの処理に利用しているThreadクラスの情報が入るからです。

このコードが書かれている場所を知りたい場合は配列の2番目を取得することに注意しましょう。

 

[PR] 未経験からWebエンジニアを目指す方法とは

実際に書いてみよう

下記のサンプルは左欄で紹介したスタックトレースを利用してクラス名を出力するプログラムです。

PrintClassのメソッドに呼び出し元のクラス名とメソッド名の出力を実装しています。

どのクラスでも同じ様にPrintClassのメソッドを呼び出していますが、出力結果が呼び出された場所に応じて変わっていることを確認してください。

package cname;

public class GetClassNameSample {

  String className;

  public static void main(String[] args) {
    PrintClass.printClassName();
    AAA aaa = new AAA();
    aaa.testA1();
    BBB bbb = new BBB();
    bbb.testB1();
  }
}
package cname;

public class PrintClass {

  /**
  * 呼び出し元のメソッドを表示する
  */
  public static void printClassName(){
    //このクラスではなく呼び出し元の情報を使用するので2番目を取る
    StackTraceElement ste = Thread.currentThread().getStackTrace()[2];
    String cname = ste.getClassName();
    String mname = ste.getMethodName();
    System.out.println(cname +"クラスの"+ mname + "メソッドから呼び出しました");
  }
}
package cname;

public class AAA {

  public void testA1() {
    PrintClass.printClassName();
    testA2();
  }

  private void testA2() {
    PrintClass.printClassName();
    BBB bbb = new BBB();
    bbb.testB1();
  }
}
package cname;

public class BBB {

  public void testB1() {
    PrintClass.printClassName();
    testB2();
  }

  private void testB2() {
    PrintClass.printClassName();
  }
}

 

実行結果

cname.GetClassNameSampleクラスのmainメソッドから呼び出しました
cname.AAAクラスのtestA1メソッドから呼び出しました
cname.AAAクラスのtestA2メソッドから呼び出しました
cname.BBBクラスのtestB1メソッドから呼び出しました
cname.BBBクラスのtestB2メソッドから呼び出しました
cname.BBBクラスのtestB1メソッドから呼び出しました
cname.BBBクラスのtestB2メソッドから呼び出しました

 

監修してくれたメンター

堀田 悠貴

以前はSEとして某大学病院の電子カルテシステムの保守・開発に携わっていました。
基本的にJavaを使用してクライアント側のプログラム開発を担当していました。

基本業務はJavaでしたが案件次第で色々他のことにも手を出す必要があり、その都度苦労した記憶があります。
現在はその会社を退社して、こちらでのメンター業務のみ行っています。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

TechAcademyでは、初心者でもJavaやServletの技術を使ってWebアプリケーション開発を習得できるオンラインブートキャンプJava講座を開催しています。

挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。