ホームページ  >  記事  >  Java  >  Java リフレクションとは何ですか? Java リフレクション メカニズムの詳細な紹介

Java リフレクションとは何ですか? Java リフレクション メカニズムの詳細な紹介

不言
不言オリジナル
2018-09-19 14:30:161964ブラウズ

この記事では、Java リフレクションとは何ですか? Java リフレクション メカニズムの詳細な紹介は、参考になると思います。

1. 概念

Java リフレクション (Reflection) とは、Java プログラムの実行中に、名前だけがわかっているクラスをロードし、そのクラスの完全な構築メソッドを取得できることを意味します。オブジェクトをインスタンス化して、オブジェクトのプロパティに値を設定するか、オブジェクトのメソッドを呼び出します。この動的にクラス情報を取得し、実行時にオブジェクトのメソッドを動的に呼び出す機能をJavaのリフレクション機構と呼びます。

2. クラス クラス

Class クラスは Object クラスを継承し、クラスまたはインターフェイスの実行時情報をカプセル化して呼び出して取得できます。 Class クラスのメソッド。この Class クラスを理解するにはどうすればよいでしょうか?通常のクラスがすべてのオブジェクトのメソッドと属性のコレクションである場合、この Class クラスはすべての通常のクラスのコレクションとして理解できます。

Class クラスを取得するいくつかの方法は次のとおりです:

public class TestClass {
    public static void main(String[] args) throws ClassNotFoundException {
        // 1、 Class.forName();
        Class<?> aClass0 = Class.forName("java.lang.Object");
        // 2、类名.Class
        Class<Integer> aClass1 = Integer.class;
        // 3、包装类.TYPE —— 返回基本类型的 Class 引用,基本类型在虚拟机运行时就已经加载了它的Class
        Class<Integer> aClass2 = Integer.TYPE;
        // 4、对象名.getClass()
        String str = "Hello, World";
        Class<? extends String> aClass3 = str.getClass();
        // 5、Class类.getSuperClass() —— 获得父类的 Class 对象
        Class<?> aClass4 = aClass3.getSuperclass();

        System.out.println(aClass0.getName());
        System.out.println(aClass1.getName());
        System.out.println(aClass2.getName());
        System.out.println(aClass3.getName());
        System.out.println(aClass4.getName());
    }
}

3. クラス情報の取得

Java のリフレクション メカニズムをテストするために、新しいペアを作成しました。親クラスと子クラスの 4 つのカプセル化プロパティをカバーし、可能な限り複数の種類の情報の取得をテストします。

Vehicle.java

vpublic class Vehicle {
    private String color;
    protected Integer seat;
    int year;
    public Date createdOn;
    private String getColor() {
        return color;
    }
    protected Integer getSeat() {
        return seat;
    }
    int getYear() {
        return year;
    }
    public Date getCreatedOn() {
        return createdOn;
    }
}

Car.java

public class Car extends Vehicle {
    private String brand;
    protected Integer a;
    int b;
    public Date updatedOn;
    public Car(){}
    private Car(String brand, Integer a, int b, Date updatedOn) {
        this.brand = brand;
        this.a = a;
        this.b = b;
        this.updatedOn = updatedOn;
    }
    private String getBrand() {
        return brand;
    }
    protected Integer getA() {
        return a;
    }
    int getB() {
        return b;
    }
    public Date getUpdatedOn() {
        return updatedOn;
    }
}

1. メソッドの取得

クラス クラスは、主に次の 2 つの方法でメソッドを取得します。

Method[] getMethods() は、アクセス可能なすべてのパブリック メソッドを返します。クラスまたはインターフェイス (継承されたパブリック メソッドを含む)。

Method[] getDeclaredMethods() このクラスまたはインターフェイスのすべてのメソッドを返します(継承されたメソッドを除く)。

public class TestMethod {
    public static void main(String[] args) {
        Class<Car> carClass = Car.class;
        Method[] methods = carClass.getMethods();
        Method[] declaredMethods = carClass.getDeclaredMethods();

        for (Method method : methods) {
        //for (Method method : declaredMethods) {
            System.out.println("方法名:" + method.getName());
            System.out.println("该方法所在的类或接口:" + method.getDeclaringClass());
            System.out.println("该方法的参数列表:" + method.getParameterTypes());
            System.out.println("该方法的异常列表:" + method.getExceptionTypes());
            System.out.println("该方法的返回值类型:" + method.getReturnType());
        }
    }
}

2. 属性の取得

クラス クラスは主に次の 2 つのメソッドで属性を取得します。

Field[] getFields(): storage すべてアクセス可能このクラスまたはインターフェイスのパブリック プロパティ (継承されたパブリック プロパティを含む)。

Field[] getDeclaredFields(): クラスまたはインターフェイスのすべてのプロパティ (継承されたプロパティを除く) を格納します。

public class TestField {
    public static void main(String[] args) {
        Class<Car> carClass = Car.class;
        Field[] fields = carClass.getFields();
        Field[] declaredFields = carClass.getDeclaredFields();
        //for (Field field : fields) {
        for (Field field : declaredFields) {
            System.out.println("属性名称是:" + field.getName());
            System.out.println("该属性所在的类或接口是:" + field.getDeclaringClass());
            System.out.println("该属性的类型是:" + field.getType());
            // field.getModifiers() 以整数形式返回由此 Field 对象表示的属性的 Java 访问权限修饰符
            System.out.println("该属性的修饰符是:" + Modifier.toString(field.getModifiers()));
        }
    }
}

3. コンストラクターの取得

Class クラスは主に次の 2 つの方法でコンストラクター メソッドを取得します。 ] getConstructors(): クラスまたはインターフェイスのすべてのパブリック コンストラクターを返します。

Constructor6b3d0130bba23ae47fe2b8e8cddf0195[] getDeclaredConstructors(): クラスまたはインターフェイスのすべてのコンストラクターを返します。

public class TestConstructor {
    public static void main(String[] args) throws NoSuchMethodException {
        Class<Car> carClass = Car.class;
        Constructor<?>[] constructors = carClass.getConstructors();
        Constructor<?>[] declaredConstructors = carClass.getDeclaredConstructors();
        Constructor<Car> carConstructor = carClass.getDeclaredConstructor(String.class, Integer.class, Integer.TYPE, Date.class);
        //for (Constructor constructor : declaredConstructors) {
        for (Constructor constructor : constructors) {
            System.out.println("该构造器的名称是:" + constructor.getName());
            System.out.println("该构造器所在的类或接口是:" + constructor.getDeclaringClass());
            //返回构造方法的参数类型
            constructor.getParameterTypes();
        }
    }
}

four 、動的呼び出し

これまで、Class クラスのメソッドを通じて、対応するクラスの属性、メソッド、コンストラクターの詳細情報を取得しました。次に、この情報を使用してオブジェクトを動的に作成し、プロパティを変更し、メソッドを動的に呼び出します。

rree

以上がJava リフレクションとは何ですか? Java リフレクション メカニズムの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。