リフレクション
日本語 | 反射映像 |
英語 | reflection |
ふりがな | りふれくしょん |
フリガナ | リフレクション |
インスタンスのクラス情報、フィールド、メソッドを動的に取得する方法。
プログラムの実行中に、インスタンスがどのクラスなのかを取得し、そのフィールド及びメソッドにアクセスする仕組みを「リフレクション」と言う。鏡のように、自分で自分の情報を取得することができる。
リフレクションを行う場合、まずObjectクラスのgetClass()メソッドでClassクラスを取得する。この中にはクラスの情報が格納されている。
ClassクラスのgetMethods()メソッドでメソッドの一覧を取得することができる。戻り値としてMethodクラスの配列が返され、このMethodクラスからメソッドの名前、引数、戻り値を取得でき、さらにそのメソッドを呼び出すこともできる。
また、getFields()メソッドでフィールド一覧を取得することもできる。戻り値としてFieldクラスの配列が返され、このFieldクラスからフィールドの名前や型を取得することができ、さらに値の取得やセットを行うことができる。
リフレクションを使用することで、非常に柔軟なプログラムを組むことができる。
ただし、リフレクションではフィールド名やメソッド名は「コンパイルチェック」が行われないため、存在しないメソッドやフィールドを使用しても実行してみない限り誤りに気付かない。そのため、本当にリフレクションが必要な場面でのみ使用するのがいいだろう。
プログラムの実行中に、インスタンスがどのクラスなのかを取得し、そのフィールド及びメソッドにアクセスする仕組みを「リフレクション」と言う。鏡のように、自分で自分の情報を取得することができる。
リフレクションを行う場合、まずObjectクラスのgetClass()メソッドでClassクラスを取得する。この中にはクラスの情報が格納されている。
ClassクラスのgetMethods()メソッドでメソッドの一覧を取得することができる。戻り値としてMethodクラスの配列が返され、このMethodクラスからメソッドの名前、引数、戻り値を取得でき、さらにそのメソッドを呼び出すこともできる。
また、getFields()メソッドでフィールド一覧を取得することもできる。戻り値としてFieldクラスの配列が返され、このFieldクラスからフィールドの名前や型を取得することができ、さらに値の取得やセットを行うことができる。
リフレクションを使用することで、非常に柔軟なプログラムを組むことができる。
ただし、リフレクションではフィールド名やメソッド名は「コンパイルチェック」が行われないため、存在しないメソッドやフィールドを使用しても実行してみない限り誤りに気付かない。そのため、本当にリフレクションが必要な場面でのみ使用するのがいいだろう。
参考サイト
// 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();
}
}
}
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();
}
}
}
// 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(); } } }
「みだし」に含まれているページ
「解説」に含まれているページ
「サンプルプログラムとか」に含まれているページ
- (参照している単語はありません)