Java リフレクションの 3 つの実装メソッドを解読する
はじめに:
Java リフレクション メカニズムは、実行時にクラス情報を動的に取得し、コンストラクターを含むクラス メンバーを操作することを指します。メソッド、フィールドなど。リフレクションを通じて、実行時にクラスの完全な構造を取得し、特定のクラス名を知らなくてもオブジェクトをインスタンス化し、メソッドを呼び出し、文字列を介してフィールドにアクセスすることができます。 Java リフレクション メカニズムの実装は、主に、Class オブジェクト、Constructor オブジェクト、および Method オブジェクトという 3 つのメソッドに依存します。この記事では、これら 3 つのメソッドの具体的な実装方法と、対応するコード例を紹介します。
1. Class オブジェクトによるリフレクションの実装
Java では、各クラスが読み込まれると、対応する Class オブジェクトが生成され、この Class オブジェクトを通じてクラスの名前や変更内容を取得することができます。これにはシンボル、親クラス、インターフェイスなどの情報が含まれており、このオブジェクトを使用してオブジェクトをインスタンス化したり、クラス内のメソッドを呼び出したりすることができます。
以下は、Class オブジェクトに基づいたリフレクション実装のサンプル コードです。
public class ReflectDemo { public static void main(String[] args) throws ClassNotFoundException { // 通过类的全限定名获取Class对象 Class<?> clazz = Class.forName("com.example.Person"); // 获取类名 String className = clazz.getName(); System.out.println(className); // 获取修饰符 int modifiers = clazz.getModifiers(); System.out.println(Modifier.toString(modifiers)); // 获取父类 Class<?> superClass = clazz.getSuperclass(); System.out.println(superClass.getName()); // 获取接口 Class<?>[] interfaces = clazz.getInterfaces(); for (Class<?> in : interfaces) { System.out.println(in.getName()); } // 实例化对象 try { Object obj = clazz.newInstance(); System.out.println(obj); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); } } } public class Person { private String name; private int age; public Person() { this.name = "John Doe"; this.age = 30; } public void sayHello() { System.out.println("Hello, my name is " + name); } }
2. Constructor オブジェクトに基づいたリフレクション実装
Constructor オブジェクトは、クラス オブジェクトを取得するために使用されるコンストラクトです。 Java リフレクション メカニズム 関数情報のオブジェクト Constructor オブジェクトを通じて、コンストラクターの修飾子、パラメーターの型、その他の情報を取得でき、このオブジェクトを使用してクラスのオブジェクトをインスタンス化できます。
次は、Constructor オブジェクトに基づいたリフレクション実装のサンプル コードです:
public class ReflectDemo { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException { Class<?> clazz = Class.forName("com.example.Person"); // 获取所有公共构造函数 Constructor<?>[] constructors = clazz.getConstructors(); for (Constructor<?> constructor : constructors) { System.out.println(constructor); } // 获取指定参数类型的构造函数 Constructor<?> constructor = clazz.getConstructor(String.class, int.class); System.out.println(constructor); // 实例化对象 try { Object obj = constructor.newInstance("Tom", 25); System.out.println(obj); } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } } } public class Person { private String name; private int age; public Person() { this.name = "John Doe"; this.age = 30; } public Person(String name, int age) { this.name = name; this.age = age; } public void sayHello() { System.out.println("Hello, my name is " + name); } }
3. Method オブジェクトに基づいたリフレクション実装
Method オブジェクトは、Java でクラスを取得するために使用されるメソッドです。リフレクション メカニズム Information オブジェクト Method オブジェクトを通じて、メソッドの修飾子、戻り値の型、パラメーターの型、その他の情報を取得し、このオブジェクトを使用してクラス内のメソッドを呼び出すことができます。
次は、メソッド オブジェクトに基づくリフレクション実装のサンプル コードです:
public class ReflectDemo { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { Class<?> clazz = Class.forName("com.example.Person"); // 获取所有公共方法 Method[] methods = clazz.getMethods(); for (Method method : methods) { System.out.println(method); } // 获取指定方法 Method method = clazz.getMethod("sayHello"); System.out.println(method); // 调用方法 try { Object obj = clazz.newInstance(); method.invoke(obj); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); } } } public class Person { private String name; private int age; public Person() { this.name = "John Doe"; this.age = 30; } public void sayHello() { System.out.println("Hello, my name is " + name); } }
概要:
Java リフレクション メカニズムは、実行時にクラスを動的に操作する手段を提供し、知らないうちにクラスを動的に操作することができます。特定のクラス名、オブジェクトのインスタンス化、メソッドの呼び出し、文字列を介したフィールドへのアクセス。この記事では、Class オブジェクト、Constructor オブジェクト、および Method オブジェクトに基づく 3 つのリフレクション実装メソッドを紹介し、参照用に対応するコード例を示します。 Java リフレクション メカニズムを使用すると、コードをより柔軟でスケーラブルにすることができますが、実際の開発では、不必要なリスクやパフォーマンスの損失を避けるために、リフレクションの使用の適切性と安全性に注意を払う必要があります。
以上がJava リフレクションの 3 つの異なる実装を明らかにするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。