Java 例付きリフレクション API チュートリアル
反射とは何か Java?
Java リフレクションは、実行時にクラスのすべての機能を分析および変更するプロセスです。 Java 実行時に、フィールド、メソッド、コンストラクタなどを含むクラスとそのメンバーを操作するために使用されます。
リフレクションAPIの利点の1つは Java つまり、クラスのプライベート メンバーも操作できます。
java.lang.reflect パッケージには、リフレクションを実装するための多くのクラスが用意されています。 java.lang.Class クラスの java.Methods は、特定のクラスの完全なメタデータを収集するために使用されます。
java.lang.reflect パッケージのクラス
以下はのリストです さまざまな Java クラス リフレクションを実装するための java.lang.package 内 -
- フィールド: このクラスは、変数のデータ型、アクセス修飾子、名前、値などの宣言情報を収集するために使用されます。
- 方法: このクラスは、メソッドのアクセス修飾子、戻り値の型、名前、パラメータの型、例外の型などの宣言情報を収集するために使用されます。
- コンストラクタ: このクラスは、コンストラクターのアクセス修飾子、名前、パラメーターの型などの宣言情報を収集するために使用されます。
- 変更: このクラスは、特定のアクセス修飾子に関する情報を収集するために使用されます。
java.lang.Classで使用されるメソッド
- パブリック文字列 getName (): クラスの名前を返します。
- パブリッククラス getSuperclass(): スーパークラス参照を返します。
- パブリッククラス[] getInterfaces() : 指定されたクラスによって実装されたインターフェイスの配列を返します。
-
getModifiers () のパブリック: パラメータとして「」に渡す必要がある、指定されたクラスの修飾子を表す整数値を返します。public static String toString (int i )」 指定されたクラスのアクセス指定子を返すメソッド。
クラスに関する完全な情報を取得する方法
public class Guru99ClassObjectCreation {
public static void main (String[] args) throws ClassNotFoundException {
//1 - By using Class.forname() method
Class c1 = Class.forName("Guru99ClassObjectCreation");
//2- By using getClass() method
Guru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation();
Class c2 = guru99Obj.getClass();
//3- By using .class
Class c3= Guru99ClassObjectCreation.class;
}
}
例 1 : クラスのメタデータを取得する方法
次の例は、クラス名、スーパークラス名、実装されたインターフェース、クラスのアクセス修飾子などのメタデータを取得する方法を示しています。
Guru99Base.class という名前の以下のクラスのメタデータを取得します。
import java.io.Serializable;
public abstract class Guru99Base implements Serializable,Cloneable {
}
- クラス名: Guru99Base
- アクセス修飾子は public と abstract です。
- シリアル化可能およびクローン化可能なインターフェイスが実装されています。
- どのクラスも明示的に拡張していないため、スーパー クラスは java.lang.Object です。
以下のクラスは、Guru99Base.class のメタデータを取得して出力します。
import java.lang.reflect.Modifier;
public class Guru99GetclassMetaData {
public static void main (String [] args) throws ClassNotFoundException {
// Create Class object for Guru99Base.class
Class guru99ClassObj = Guru99Base.class;
// Print name of the class
system.out.println("Name of the class is : " +guru99ClassObj.getName());
// Print Super class name
system.out.println("Name of the super class is : " +guru99ClassObj.getSuperclass().getName());
// Get the list of implemented interfaces in the form of Class array using getInterface() method
class[] guru99InterfaceList = guru99classObj.getInterfaces();
// Print the implemented interfaces using foreach loop
system.out.print("Implemented interfaces are : ");
for (Class guru99class1 : quru99 InterfaceList) {
system.out.print guru99class1.getName() + " ");
}
system.out.println();
//Get access modifiers using get Modifiers() method and toString() method of java.lang.reflect.Modifier class
int guru99AccessModifier= guru99classObj.getModifiers();
// Print the access modifiers
System.Out.println("Access modifiers of the class are : " +Modifier.tostring(guru99AccessModifier));
}
}
- getNameメソッドを使用してクラスの名前を出力します。
- getSuperClass().getName() メソッドを使用してスーパークラスの名前を出力します。
- 実装されたインターフェースの名前を出力します。
- クラスで使用されるアクセス修飾子を出力します。
例 2 : 変数のメタデータを取得する方法
次の例は、変数のメタデータを取得する方法を示しています。
ここでは、いくつかの変数を含む Guru99VariableMetaData .class という名前のクラスを作成しています。
package guru;
public class Guru99VariableMetaData {
public static int guru99IntVar1=1111;
static int guru99IntVar2=2222;
static String guru99StringVar1="guru99.com";
static String guru99StringVar2="Learning Reflection API";
}
-
以下のように、上記のクラス、つまり Guru99VariableMetaData.class のクラス オブジェクトを作成します。
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
次を使用してフィールド配列の形式でメタデータを取得します。 getFields() or getDeclaredFields() 以下のような方法:
Field[] guru99Field1= guru99ClassObjVar .getFields(); Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
getFields() このメソッドは、指定されたクラスおよびそのスーパークラスからパブリック変数のメタデータを返します。
getDeclaredFields() このメソッドは、指定されたクラスのみからのすべての変数のメタデータを返します。
- 「public String getName()」メソッドを使用して変数の名前を取得します。
- 「public Class getType()」メソッドを使用して変数のデータ型を取得します。
-
「public xxx get (Field)」メソッドを使用して変数の値を取得します。
ここで、xxx は、フェッチする任意のタイプの値の XNUMX バイトまたはそれ未満の値にすることができます。
-
getModifier() メソッドと Modifier.toString(int i) メソッドを使用して、変数のアクセス修飾子を取得します。
ここでは、クラス Guru99VariableMetaData .class に存在する変数のメタデータを取得するクラスを作成しています。
package guru; import java.lang.reflect.Field; public class Guru99VariableMetaDataTest { public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { // Create Class object for Guru99VariableMetaData.class Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass(); // Get the metadata of all the fields of the class Guru99VariableMetaData Field[] guru99Field1= guru99ClassObjVar.getDeclaredFields(); // Print name, datatypes, access modifiers and values of the varibales of the specified class for(Field field : guru99Field1) { System.out.println("Variable name : "+field.getName()); System.out.println("Datatypes of the variable :"+field.getType()); int guru99AccessModifiers = field.getModifiers(); System.out.printlln("Access Modifiers of the variable : "+Modifier.toString(guru99AccessModifiers)); System.out.println("Value of the variable : "+field.get(guru99ClassVar)); System.out.println(); system.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ; } } } - Guru99VariableMetaData.class のクラス オブジェクトを作成しました
- Field 配列内の変数のすべてのメタデータを取得しました
- クラス Guru99VariableMetaData.class 内のすべての変数名を出力します。
- Guru99VariableMetaData.class クラス内の変数のすべてのデータ型を出力します。
- Guru99VariableMetaData.class クラス内の変数のすべてのアクセス修飾子を出力します。
- クラス内のすべての変数の値を出力しました。 クラス Guru99VariableMetaData.class 内の変数のすべてのデータ型を出力しました。
-
以下のように、上記のクラス、つまり Guru99MethodMetaData.class のクラス オブジェクトを作成します。
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData (); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
以下のように getMethods() および getDeclaredMethods() メソッドを使用して、Method 配列内のメソッド情報を取得します。
Method[] guru99 Method 1= guru99ClassObjVar .get Methods(); Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
getメソッド() メソッドは、指定されたクラスおよびそのスーパークラスからパブリック メソッドのメタデータを返します。
getDeclaredMethods() メソッドは、指定されたクラスのみからのすべてのメソッドのメタデータを返します。
- 次を使用してメソッドの名前を取得します getName() 方法。
- 次を使用してメソッドの戻り値の型を取得します。 getReturnType() 方法。
- 次を使用してメソッドのアクセス修飾子を取得します。 getModifiers() および Modifiers.toString(int i) 方法。
- 次を使用してメソッドパラメータの型を取得します getParameterTypes() クラス配列を返すメソッド。
-
を使用してスローされた例外を取得します getExceptionTypes() クラス配列を返すメソッド。
- Guru99MethodMetaData.class のクラス オブジェクトを作成しました
- Method 配列内のすべてのメソッドのすべてのメタデータを取得します
- Guru99MethodMetaData.class クラスに存在するすべてのメソッド名を出力します。
- Guru99MethodMetaData.class クラスのメソッドの出力された戻り値の型
- Guru99MethodMetaData.class クラス内のメソッドのすべてのアクセス修飾子を出力します。
- Guru99MethodMetaData.class のメソッドの出力パラメータ タイプ
-
出力された例外は、Guru99MethodMetaData.class のメソッドによってスローされます。
- Guru99Constructor.class のクラス オブジェクトを作成しました
- Constructor 配列内のすべてのコンストラクターのすべてのメタデータを取得します
- Guru99Constructor.class クラスに存在するすべてのコンストラクター名を出力します。
- Guru99Constructor.class クラス内のコンストラクターのすべてのアクセス修飾子を出力します。
- Guru99Constructor.class のコンストラクターの出力されたパラメーターの型
- 出力された例外は、Guru99Constructor.class のコンストラクターによってスローされます。
- Java のリフレクション プログラミングは、変数、メソッド、コンストラクターなどのクラスおよびクラス メンバーに関する情報の取得と変更に役立ちます。
- リフレクションAPI Java java.lang.reflect パッケージ内のクラスと java.lang.Class クラスのメソッドを使用して実装できます。
- java.lang.Class クラスの一般的に使用されるメソッドには、getName ()、getSuperclass ()、getInterfaces ()、getModifiers () などがあります。
- java.lang.reflect パッケージでよく使用されるクラスには、Field、Method、Constructor、Modifier などがあります。
- リフレクション API は、セキュリティ上の脅威となる可能性のあるクラスのプライベート メソッドおよび変数にアクセスできます。
- リフレクションAPIは、 Javaただし、パフォーマンスの低下、セキュリティの脆弱性、権限の問題などのオーバーヘッドが伴います。したがって、リフレクション API は、操作を実行するための最後の手段として扱う必要があります。
例 3 : メソッドのメタデータを取得する方法
次の例は、メソッドのメタデータを取得する方法を示しています。
ここでは、いくつかのメソッドを含む Guru99MethodMetaData .class という名前のクラスを作成しています。
package guru;
import java.sql.SQLException;
public class Guru99MethodMetaData {
public void guru99Add(int firstElement, int secondElement , String result)
throws ClassNotFoundException, ClassCastException{
System.out.println("Demo method for Reflextion API");
}
public String guru99Search(String searchString)
throws ArithmeticException, InterruptedException{
System.out.println("Demo method for Reflection API");
return null;
}
public void guru99Delete(String deleteString)
throws SQLException{
System.out.println("Demo method for Reflection API");
}
}
上記のクラスのメソッドに関するメタデータを取得する手順は次のとおりです。
ここでは、クラス Guru99MethodMetaData.class に存在するメソッドのメタデータを取得するクラスを作成しています。
package guru;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class Guru99MethodMetaDataTest {
public static void main (String[] args) {
// Create Class object for Guru99Method MetaData.class
class guru99ClassObj = Guru99MethodMetaData.class;
// Get the metadata or information of all the methods of the class using getDeclaredMethods()
Method[] guru99Methods=guru99classObj.getDeclaredMethods();
for(Method method : guru99Methods) {
// Print the method names
System.out.println("Name of the method : "+method.getName());
// Print return type of the methods
System.out.println("Return type of the method : "+method.getReturnType());
//Get the access modifier list and print
int guru99ModifierList = method.getModifiers();
System.Out.printlin ("Method access modifiers : "+Modifier.toString(guru99ModifierList));
// Get and print parameters of the methods
Class[] guru99ParamList= method.getParameterTypes();
system.out.print ("Method parameter types : ");
for (Class class1 : guru99ParamList){
System.out.println(class1.getName()+" ");
}
System.out.println();
// Get and print exception thrown by the method
Class[] guru99ExceptionList = method. getExceptionTypes();
system.out.print("Excpetion thrown by method :");
for (Class class1 : guru99ExceptionList) {
System.out.println (class1.getName() +" "):
}
System.Out.println();
system.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");
}
}
}
例 4 : コンストラクターのメタデータを取得する方法
次の例は、コンストラクターのメタデータを取得する方法を示しています。
ここでは、さまざまなコンストラクターを使用して Guru99Constructor.class という名前のクラスを作成しています。
package guru;
import java.rmi.RemoteException;
import java.sql.SQLException;
public class Guru99Constructor {
public Guru99Constructor(int no) throws ClassCastException ,ArithmeticException{ }
public Guru99Constructor(int no, String name) throws RemoteException ,SQLException{ }
public Guru99Constructor(int no, String name, String address) throws InterruptedException{ }
}
ここでは、Guru99Constructor.class クラスに存在するコンストラクターのメタデータを取得するクラスを作成しています。
package guru;
import java.lang.reflect.Constructor;
public class Guru99ConstructorMetaDataTest {
public static void main (String[] args) {
// Create Class object for Guru99Constructor.class
Class guru99Class=Guru99Constructor.class;
// Get all the constructor information in the Constructor array
Constructor[] guru99ConstructorList = guru99Class.getConstructors();
for (Constructor constructor : guru99ConstructorList) {
// Print all name of each constructor
System.out.println("Constrcutor name : "+constructor.getName());
//Get and print access modifiers of each constructor
int guru99Modifiers= constructor.getModifiers();
System.Out.printlin ("Constrctor modifier : "+Modifier.toString(guru99Modifiers));
// Get and print parameter types
Class[] guru99ParamList=constructor.getParameterTypes();
System.out.print ("Constrctor parameter types :");
for (Class class1 : guru99ParamList) {
System.out.println(class1.getName() +" ");
}
System. out.println();
// Get and print exception thrown by constructors
Class[] guru99ExceptionList=constructor.getFxceptionTypes();
System.out.println("Exception thrown by constructors :");
for (Class class1 : guru99ExceptionList) {
System.out.println(class1.getName() +" ");
}
System.out.println();
System.out.println("*******************************************");
}
}
}
















