JavaA2Z

KAB-studio > プログラミング > JavaA2Z > リフレクションとは

リフレクション

日本語 反射映像
英語 reflection
ふりがな りふれくしょん
フリガナ リフレクション

解説

インスタンスクラス情報、フィールドメソッド動的に取得する方法。
プログラムの実中に、インスタンスがどのクラスなのかを取得し、そのフィールド及びメソッドにアクセスする仕組みを「リフレクション」と言う。鏡のように、自分で自分の情報を取得することができる。
 
リフレクションをう場合、まずObjectクラスのgetClass()メソッドClassクラスを取得する。この中にはクラスの情報が格納されている。
ClassクラスのgetMethods()メソッドメソッドの一覧を取得することができる。戻り値としてMethodクラス配列が返され、このMethodクラスからメソッドの名前、引数戻り値を取得でき、さらにそのメソッド呼び出すこともできる。
また、getFields()メソッドフィールド一覧を取得することもできる。戻り値としてFieldクラス配列が返され、このFieldクラスからフィールドの名前やを取得することができ、さらに値の取得やセットをうことができる。
 
リフレクションを使用することで、非常に柔軟なプログラムを組むことができる。
ただし、リフレクションではフィールド名やメソッド名は「コンパイルチェック」がわれないため、存在しないメソッドフィールドを使用しても実してみない限り誤りに気付かない。そのため、本当にリフレクションが必要な場面でのみ使用するのがいいだろう。

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

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

public class Sample
{
    public static void main( String[] args )
    {
        String string = "あいうえお";

        // string変数のClassクラスを取得します。
        Class stringClass = string.getClass();
        System.out.println( stringClass );
        // class java.lang.String

        // toString()メソッドだけ取っておきます。
        Method toStringMethod = null;

        // Stringクラスのメソッド一覧を取得します。
        Method[] methods = stringClass.getMethods();
        forint iF1 = 0; iF1 < methods.length; ++iF1 )
        {
            Method method = methods[iF1];
            System.out.println( method );

            if( method.getName().equals( "toString" ) )
            {
                toStringMethod = method;
            }
        }
        // public int java.lang.String.hashCode()
        // public int java.lang.String.compareTo(java.lang.Object)
        // public int java.lang.String.compareTo(java.lang.String)
        // public boolean java.lang.String.equals(java.lang.Object)
        // public java.lang.String java.lang.String.toString()
        // public int java.lang.String.length()
        // public char java.lang.String.charAt(int)
        // public void java.lang.String.getChars(int,int,char[],int)
        // public byte[] java.lang.String.getBytes()
        // public void java.lang.String.getBytes(int,int,byte[],int)
        // public byte[] java.lang.String.getBytes(java.lang.String) throws java.io.UnsupportedEncodingException
        // public boolean java.lang.String.contentEquals(java.lang.StringBuffer)
        // public boolean java.lang.String.equalsIgnoreCase(java.lang.String)
        // public int java.lang.String.compareToIgnoreCase(java.lang.String)
        // public boolean java.lang.String.regionMatches(int,java.lang.String,int,int)
        // public boolean java.lang.String.regionMatches(boolean,int,java.lang.String,int,int)
        // public boolean java.lang.String.startsWith(java.lang.String,int)
        // public boolean java.lang.String.startsWith(java.lang.String)
        // public boolean java.lang.String.endsWith(java.lang.String)
        // public int java.lang.String.indexOf(int,int)
        // public int java.lang.String.indexOf(int)
        // public int java.lang.String.indexOf(java.lang.String)
        // public int java.lang.String.indexOf(java.lang.String,int)
        // public int java.lang.String.lastIndexOf(java.lang.String,int)
        // public int java.lang.String.lastIndexOf(int)
        // public int java.lang.String.lastIndexOf(java.lang.String)
        // public int java.lang.String.lastIndexOf(int,int)
        // public java.lang.String java.lang.String.substring(int,int)
        // public java.lang.String java.lang.String.substring(int)
        // public java.lang.CharSequence java.lang.String.subSequence(int,int)
        // public java.lang.String java.lang.String.concat(java.lang.String)
        // public java.lang.String java.lang.String.replace(char,char)
        // public boolean java.lang.String.matches(java.lang.String)
        // public java.lang.String java.lang.String.replaceFirst(java.lang.String,java.lang.String)
        // public java.lang.String java.lang.String.replaceAll(java.lang.String,java.lang.String)
        // public java.lang.String[] java.lang.String.split(java.lang.String,int)
        // public java.lang.String[] java.lang.String.split(java.lang.String)
        // public java.lang.String java.lang.String.toLowerCase()
        // public java.lang.String java.lang.String.toLowerCase(java.util.Locale)
        // public java.lang.String java.lang.String.toUpperCase(java.util.Locale)
        // public java.lang.String java.lang.String.toUpperCase()
        // public java.lang.String java.lang.String.trim()
        // public char[] java.lang.String.toCharArray()
        // public static java.lang.String java.lang.String.valueOf(char[],int,int)
        // public static java.lang.String java.lang.String.valueOf(char[])
        // public static java.lang.String java.lang.String.valueOf(java.lang.Object)
        // public static java.lang.String java.lang.String.valueOf(char)
        // public static java.lang.String java.lang.String.valueOf(boolean)
        // public static java.lang.String java.lang.String.valueOf(int)
        // public static java.lang.String java.lang.String.valueOf(long)
        // public static java.lang.String java.lang.String.valueOf(float)
        // public static java.lang.String java.lang.String.valueOf(double)
        // public static java.lang.String java.lang.String.copyValueOf(char[],int,int)
        // public static java.lang.String java.lang.String.copyValueOf(char[])
        // public native java.lang.String java.lang.String.intern()
        // public final native java.lang.Class java.lang.Object.getClass()
        // public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
        // public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
        // public final void java.lang.Object.wait() throws java.lang.InterruptedException
        // public final native void java.lang.Object.notify()
        // public final native void java.lang.Object.notifyAll()

        // toString()メソッドを呼び出します。
        try
        {
            // toStringMethodには「toString()メソッド」が入っています。
            // そこで、string変数を使って「toString()メソッド」を呼び出します。
            // 引数はないのでObjectクラスの要素数0の配列を渡します。
            // 戻り値としてstring.toString()の結果が返されます。
            String toStringed = (String)toStringMethod.invoke( string, new Object[0] );
            System.out.println( toStringed );
            // あいうえお
        }
        catch( IllegalAccessException e )
        {
            e.printStackTrace();
        }
        catch( IllegalArgumentException e )
        {
            e.printStackTrace();
        }
        catch( InvocationTargetException e )
        {
            e.printStackTrace();
        }
    }
}
// Sample.java
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;

public class Sample
{
    public static void main( String[] args )
    {
        String string = "あいうえお";

        // string変数のClassクラスを取得します。
        Class stringClass = string.getClass();
        System.out.println( stringClass );
        // class java.lang.String

        // toString()メソッドだけ取っておきます。
        Method toStringMethod = null;

        // Stringクラスのメソッド一覧を取得します。
        Method[] methods = stringClass.getMethods();
        for( int iF1 = 0; iF1 < methods.length; ++iF1 )
        {
            Method method = methods[iF1];
            System.out.println( method );

            if( method.getName().equals( "toString" ) )
            {
                toStringMethod = method;
            }
        }
        // public int java.lang.String.hashCode()
        // public int java.lang.String.compareTo(java.lang.Object)
        // public int java.lang.String.compareTo(java.lang.String)
        // public boolean java.lang.String.equals(java.lang.Object)
        // public java.lang.String java.lang.String.toString()
        // public int java.lang.String.length()
        // public char java.lang.String.charAt(int)
        // public void java.lang.String.getChars(int,int,char[],int)
        // public byte[] java.lang.String.getBytes()
        // public void java.lang.String.getBytes(int,int,byte[],int)
        // public byte[] java.lang.String.getBytes(java.lang.String) throws java.io.UnsupportedEncodingException
        // public boolean java.lang.String.contentEquals(java.lang.StringBuffer)
        // public boolean java.lang.String.equalsIgnoreCase(java.lang.String)
        // public int java.lang.String.compareToIgnoreCase(java.lang.String)
        // public boolean java.lang.String.regionMatches(int,java.lang.String,int,int)
        // public boolean java.lang.String.regionMatches(boolean,int,java.lang.String,int,int)
        // public boolean java.lang.String.startsWith(java.lang.String,int)
        // public boolean java.lang.String.startsWith(java.lang.String)
        // public boolean java.lang.String.endsWith(java.lang.String)
        // public int java.lang.String.indexOf(int,int)
        // public int java.lang.String.indexOf(int)
        // public int java.lang.String.indexOf(java.lang.String)
        // public int java.lang.String.indexOf(java.lang.String,int)
        // public int java.lang.String.lastIndexOf(java.lang.String,int)
        // public int java.lang.String.lastIndexOf(int)
        // public int java.lang.String.lastIndexOf(java.lang.String)
        // public int java.lang.String.lastIndexOf(int,int)
        // public java.lang.String java.lang.String.substring(int,int)
        // public java.lang.String java.lang.String.substring(int)
        // public java.lang.CharSequence java.lang.String.subSequence(int,int)
        // public java.lang.String java.lang.String.concat(java.lang.String)
        // public java.lang.String java.lang.String.replace(char,char)
        // public boolean java.lang.String.matches(java.lang.String)
        // public java.lang.String java.lang.String.replaceFirst(java.lang.String,java.lang.String)
        // public java.lang.String java.lang.String.replaceAll(java.lang.String,java.lang.String)
        // public java.lang.String[] java.lang.String.split(java.lang.String,int)
        // public java.lang.String[] java.lang.String.split(java.lang.String)
        // public java.lang.String java.lang.String.toLowerCase()
        // public java.lang.String java.lang.String.toLowerCase(java.util.Locale)
        // public java.lang.String java.lang.String.toUpperCase(java.util.Locale)
        // public java.lang.String java.lang.String.toUpperCase()
        // public java.lang.String java.lang.String.trim()
        // public char[] java.lang.String.toCharArray()
        // public static java.lang.String java.lang.String.valueOf(char[],int,int)
        // public static java.lang.String java.lang.String.valueOf(char[])
        // public static java.lang.String java.lang.String.valueOf(java.lang.Object)
        // public static java.lang.String java.lang.String.valueOf(char)
        // public static java.lang.String java.lang.String.valueOf(boolean)
        // public static java.lang.String java.lang.String.valueOf(int)
        // public static java.lang.String java.lang.String.valueOf(long)
        // public static java.lang.String java.lang.String.valueOf(float)
        // public static java.lang.String java.lang.String.valueOf(double)
        // public static java.lang.String java.lang.String.copyValueOf(char[],int,int)
        // public static java.lang.String java.lang.String.copyValueOf(char[])
        // public native java.lang.String java.lang.String.intern()
        // public final native java.lang.Class java.lang.Object.getClass()
        // public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
        // public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
        // public final void java.lang.Object.wait() throws java.lang.InterruptedException
        // public final native void java.lang.Object.notify()
        // public final native void java.lang.Object.notifyAll()

        // toString()メソッドを呼び出します。
        try
        {
            // toStringMethodには「toString()メソッド」が入っています。
            // そこで、string変数を使って「toString()メソッド」を呼び出します。
            // 引数はないのでObjectクラスの要素数0の配列を渡します。
            // 戻り値としてstring.toString()の結果が返されます。
            String toStringed = (String)toStringMethod.invoke( string, new Object[0] );
            System.out.println( toStringed );
            // あいうえお
        }
        catch( IllegalAccessException e )
        {
            e.printStackTrace();
        }
        catch( IllegalArgumentException e )
        {
            e.printStackTrace();
        }
        catch( InvocationTargetException e )
        {
            e.printStackTrace();
        }
    }
}

この単語を含むページ

「みだし」に含まれているページ

「サンプルプログラムとか」に含まれているページ

  • (参照している単語はありません)
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/07/09
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。