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

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

目次

リフレクション

クラスの情報を取得する方法1

Class<?> 変数 = クラス.class;

クラス情報を取得したいクラス名に.classを追加して、クラス情報のインスタンス(Classクラス)を取得します。

コード

6行目のColor.classで、13行目のクラスの情報を持つClassクラスのインスタンスを取得しています。
8行目のgetSimpleNameメソッドは、クラス名を表示します。
9行目のgetPackageメソッドは、パッケージ名を表示します。
10行目のgetNameメソッドは、パッケージ名+クラス名(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 {
}

クラスの情報を取得する方法2

Class<?> 変数 = インスタンスの変数.getClass();

インスタンスの変数とgetClassメソッドで、クラス情報のインスタンス(Classクラス)を取得します。

コード

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

9行目のgetSimpleNameメソッドは、クラス名を表示します。
10行目のgetPackageメソッドは、パッケージ名を表示します。
11行目のgetNameメソッドは、パッケージ名+クラス名(FQCN)を表示します。

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 {
}

クラスの情報を取得する方法3

Class<?> 変数 = Class.forName(クラス);

Class.forNameと引数にクラスを指定して、クラス情報のインスタンス(Classクラス)を取得します。

コード

7行目のClass.forNameで、17行目のクラスの情報を持つClassクラスのインスタンスを取得しています。
Class.forNameを使用する場合、try-catchでの例外処理が必要です。
9行目のgetSimpleNameメソッドは、クラス名を表示します。
10行目のgetPackageメソッドは、パッケージ名を表示します。
11行目のgetNameメソッドは、パッケージ名+クラス名(FQCN)を表示します。

package test1;

public class Test1 {
    public static void main(String[] args)   {

    	try {
			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
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}	
    }
}
class Color {
}

メンバー変数を取得する

public Field[] getDeclaredFields()  throws SecurityException

コード

10行目は、getDeclaredFieldsメソッドで19行目のクラスのメンバー変数を取得しています。
戻り値は、配列です。
12-16行目は、拡張for文で取得した値を表示しています。

package test1;

import java.lang.reflect.Field;

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
        }
    }
}
class Color {
    private String moji = "色は";
    private String name;
}

メソッドを取得する

public Method[] getDeclaredMethods() throws SecurityException

コード

10行目は、getDeclaredMethodsメソッドで19行目のクラスのメソッドを取得しています。
戻り値は、配列です。
12-16行目は、拡張for文で取得した値を表示しています。

package test1;

import java.lang.reflect.Method;

public class Test1 {
    public static void main(String[] args)   {
        
        Class<Color> c = Color.class;
        
        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 {
	String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

メソッドを実行する

10行目は、getClassメソッドで38行目のクラスの情報を持つClassクラスのインスタンスを取得しています。
15-21行目は、ClassクラスのgetMethodとMethodクラスのinvokeメソッドで42,45行目のメソッドを実行しています。

package test1;

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

public class Test1 {
    public static void main(String[] args)   {
        
        Color color = new Color();
        Class<?> c1 = color.getClass();
        
        Method method1;
        Method method2;
        try {
            method1 = c1.getMethod("setName", String.class);
            
            method1.invoke(color, "オレンジ");
            
            method2 = c1.getMethod("getName");
            
            String result = (String) method2.invoke(color);
            
            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;
    }
}

privateのメンバー変数を変更する

本来、privateのメンバー変数はクラスの外部から変更できませんが、リフレクションを使用すると可能になります。

9行目は、getClassメソッドで29行目のクラスの情報を持つClassクラスのインスタンスを取得しています。
14行目は、getDeclaredFieldメソッドで引数に30行目のメンバ変数を指定しています。
15行目は、setAccessibleメソッドでアクセスできるようにしています。
17行目は、setメソッドでprivateの変数に値をセットしています。

package test1;

import java.lang.reflect.Field;

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

        Field a1;
    
		try {
			a1 = c1.getDeclaredField("moji");
	        a1.setAccessible(true);
	        try {
				a1.set(color, "カラー");
				System.out.println(color.getName()); //カラー
			} catch (IllegalArgumentException | IllegalAccessException e) {
				e.printStackTrace();
			}
		} catch (NoSuchFieldException e1) {
			e1.printStackTrace();
		} catch (SecurityException e1) {
			e1.printStackTrace();
		}
    }
}
class Color {
    private String moji;
    public String getName() {
        return moji;
    }
}

 

Classクラス

Methodクラス

 

関連の記事

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



△上に戻る