Java リフレクションのサンプル

Javaのリフレクションのサンプルです。

目次

リフレクション

  • プログラム実行中に、Classクラスのインスタンスを使用して指定したクラスのメンバー変数やメソッドの情報を取得し呼び出せます。

Classクラス

Methodクラス

 

Classクラスのインスタンスを取得する方法1

6行目の記述で、13行目のColorクラスの情報を持つClassクラスのインスタンスを取得しています。
8行目のgetSimpleNameメソッドは、13行目のColorクラスのクラス名を表示します。
9行目のgetPackageメソッドは、13行目のColorクラスのパッケージ名を表示します。
10行目のgetNameメソッドは、13行目のColorクラスのパッケージ名+クラス名(FQCN)を表示します。

package test1;

public class Test1 {
    public static void main(String[] args)   {
        
        Class<?> c = Color.class;

        System.out.println(c.getSimpleName()); //Color
        System.out.println(c.getPackage()); //package test1
        System.out.println(c.getName()); //test1.Color
    }
}
class Color {
}

Classクラスのインスタンスを取得する方法2

6行目は、14行目のクラスをインスタンス化しています。
7行目は、getClassメソッドでColorクラスの情報を持つClassクラスのインスタンスを取得しています。
getClassメソッドはObjectクラスにあるメソッドです。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Object.html#getClass--

package test1;

public class Test1 {
    public static void main(String[] args)   {
        
        Color cl = new Color();
        Class<?> c = cl.getClass();

        System.out.println(c.getSimpleName()); //Color
        System.out.println(c.getPackage()); //package test1
        System.out.println(c.getName()); //test1.Color
    }
}
class Color {
}

Classクラスのインスタンスを取得する方法3

15行目は、ClassクラスのforNameメソッドで22行目のColorクラスの情報を持つClassクラスのインスタンスを取得しています。引数はパッケージ名+クラス名(FQCN)です。

package test1;

public class Test1 {
    public static void main(String[] args)   {
        try {
            Sample.runSample();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
class Sample {
    static void runSample() throws ClassNotFoundException{
        
        Class<?> c = Class.forName("test1.Color");
        
        System.out.println(c.getSimpleName()); //Color
        System.out.println(c.getPackage()); //package test1
        System.out.println(c.getName()); //test1.Color
    }
}
class Color {
}

クラスのメンバー変数やメソッドを取得する

11行目は、getDeclaredFieldsメソッドで28行目のクラスのメンバー変数を取得しています。
19行目は、getDeclaredMethodsメソッドで28行目のクラスのメソッドを取得しています。

package test1;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test1 {
    public static void main(String[] args)   {
        
        Class<Color> c = Color.class;

        Field[] aaa = c.getDeclaredFields();
        
        for (Field a : aaa) {
            System.out.println(a);
            //private java.lang.String test1.Color.moji
            //private java.lang.String test1.Color.name
        }
        
        Method[] bbb = c.getDeclaredMethods();
        
        for (Method a : bbb) {
            System.out.println(a);
            //public java.lang.String test1.Color.getName()
            //public void test1.Color.setName(java.lang.String)
        }
    }
}
class Color {
    private String moji = "色は"; //変数
    private String name; //変数

    public String getName() { //メソッド
        return moji + name;
    }
    public void setName(String name) { //メソッド
        this.name = name;
    }
}

メソッドを実行する

10行目は、Classクラスのインスタンスを取得しています。
15,17行目は、リフレクションで45行目のメソッドを実行しています。
19,21行目は、リフレクションで42行目のメソッドを実行しています。

package test1;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test1 {
    public static void main(String[] args)   {
        
        Color cl = new Color();
        Class<?> c = cl.getClass();
        
        Method method1;
        Method method2;
        try {
            method1 = c.getMethod("setName", String.class);
            
            method1.invoke(cl, "オレンジ");
            
            method2 = c.getMethod("getName");
            
            String result = (String) method2.invoke(cl);
            
            System.out.println(result); //色はオレンジ
               
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}
class Color {
    private String moji = "色は"; //変数
    private String name; //変数

    public String getName() { //メソッド
        return moji + name;
    }
    public void setName(String name) { //メソッド
        this.name = name;
    }
}

関連の記事

Java クラスのサンプル
Java コンストラクタのサンプル
Java クラスの継承とオーバーライドのサンプル
Java 匿名クラスのサンプル
Java ネストしたクラスのサンプル
Java クラスの変数のサンプル(メンバー変数/ローカル変数)
Java 変数の型変換のサンプル(基本型と参照型)
Java インスタンスの型を調べるサンプル(instanceof)
Java クラスのthisのサンプル
Java インターフェースのサンプル
Java abstract修飾子のサンプル
Java シングルトンのサンプル
Java ポリモフィズムのサンプル
Java staticメソッドとstatic変数のサンプル
Java 委譲のサンプル

 はまったらエンジニア特化型Q&Aサイト
【teratail(テラテイル)】で質問しましょう!


△上に戻る