Tagbangers Blog

Javaの気持ちを本気出して考えてみた。

Javaの超基礎的な話なのですが、import文って知ってますよね?

そもそもどうやってクラスを正しく判別してimportしているんでしょうね。そしてどうやってメソッドを呼んでいるんでしょうね。

ま、普通にMainクラスからPrintTagbangersを呼ぶ時こんな感じだと思います。

Main.java

package com.example.sample2;

import java.lang.reflect.Method;

public class Main {

   public static void main(String[] args) throws Exception {
      PrintTagbangers printTagbangers = new PrintTagbangers();
      printTagbangers.print();
   }
}


PrintTagbangers.java

package com.example.sample1;

public class PrintTagbangers {

   private String companyName = "Tagbangers";

   public void print() {
      System.out.println(companyName);
   }
}


先に作られた方(Java)が今後作成されるであろうクラスなどを知っているはずはありません!

どのようにクラスを見つけているか。実は、クラスパスの文字列からクラスを探しているのです。

では、早速コードです。クラスをimportしてからメソッドを呼び出すまでの例です。


Main.java

package com.example.sample2;

import java.lang.reflect.Method;

public class Main {

   public static void main(String[] args) throws Exception {

      Class clazz = Main.class.getClassLoader().loadClass("com.example.sample1.PrintTagbangers");
      (Class clazz = Class.forName("com.example.sample1.PrintTagbangers");)

      Object object = clazz.newInstance();

      Method method = clazz.getMethod("print");
      method.invoke(object);
   }
}


PrintTagbangers.javaは変化なしのため省略。

1.クラスパスの文字列からClassクラスを生成。

2.生成したClassクラスをインスタンス化。new式に空の引数リストを指定した場合と同様。

3.メソッド名の文字列からMethodクラスを取得。Methodクラスは、指定したメソッドに関する情報とそのアクセスを提供する。

4.invokeメソッドでclazz.printメソッドを実行。

普段は、import文を使うのでほとんで使用することはないですが知識の一つとして!