ホームページ  >  記事  >  Java  >  Javaにおけるリフレクションの意味と役割は何ですか?

Javaにおけるリフレクションの意味と役割は何ですか?

WBOY
WBOY転載
2023-04-21 15:16:081442ブラウズ

1. リフレクションの概要

リフレクション (リフレクション) は、動的言語としてみなされるための鍵です。リフレクション メカニズムにより、プログラムは実行中にリフレクション API を通じて任意のクラスの内部情報を取得できます。任意のオブジェクト、内部プロパティおよびメソッドを直接操作できます。クラスがロードされると、ヒープ メモリのメソッド領域に Class 型オブジェクトが生成されます (クラスには Class オブジェクトが 1 つだけあります)。このオブジェクトには、クラスの完全な構造情報が含まれています。このオブジェクトを通してクラスの構造を見ることができます。このオブジェクトは鏡のようなものです。この鏡を通してクラスの構造を見ることができるので、これを反射と呼びます。

2. 一般的に使用される api

java.lang.Class: クラス

#java.lang.reflect.Method## を表します# : クラス

java.lang.reflect.Fieldのメソッドを表します: クラス

java.lang.reflectのメンバー変数を表します。 Constructor: クラスを表すコンストラクター

static Class forName(String name) 指定されたクラス名 name の Class オブジェクトを返します

Object newInstance( ) なしパラメータ コンストラクタを呼び出し、クラス オブジェクトのインスタンスを返します。

getName() エンティティの名前を返します (クラス、インターフェイス、配列クラス、基本型、または void)。この Class オブジェクトによって表されます

Class getSuperClass() 現在の Class オブジェクトの親クラスの Class オブジェクトを返します

##Class [] getInterfaces()

現在の Class オブジェクトのインターフェイスを取得します

ClassLoader getClassLoader()

このクラスのクラス ローダーを返します

Class getSuperclass()

戻り値このクラスによって表されるエンティティのスーパークラスを表すクラス

Constructor[] getConstructors()

特定の Constructor オブジェクトを含む配列を返します

Field[ ] getDeclaredFields()

Field オブジェクトの配列を返します Array Method

getMethod(String name,Class … paramTypes)

Method オブジェクトを返します。このオブジェクトの正式パラメータ タイプは paramType です。 例:

public class Person {
    private String name;
    private int age;
    public Person() {
        System.out.println("Person类被初始化了。。。。。^_^");
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
    }
}

Reflection

public class ClassDemo {
    public static void main(String[] args) throws
        Exception {
        // 1. 创建Class对象
        //Class<Person> clazz = (Class<Person>)
        Class.forName("Person");
        Class<?> clazz =Class.forName("Person");
            // 2. 通过Class对象调用其方法
            // 2.1. 通过反射来实例化对象
            //Person person = clazz.newInstance();
            Object o = clazz.newInstance(); // 此名就相当于
        Person p = new Person()
            // 2.2. 获取类的完整类名称(包名+类名)
            String name = clazz.getName();
        System.out.println(name);
        // 2.3. 获取类的简单名称,就是类的名称,不含包名
        System.out.println(clazz.getSimpleName());
        // 2.4. 获取构造器
        Constructor<?>[] constructors =
            clazz.getConstructors();
        for (Constructor<?> constructor :
             constructors) {
            System.out.println(constructor.getName());
        }
        // 2.5. 获取字段
        Field[] fields = clazz.getFields();
        for (Field field : fields) {
            System.out.println(field.getName());
        }
        // 2.6. 获取方法
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            System.out.println(method.getName());
        }
    }
}

3. クラス オブジェクトを作成する 4 つの方法

public class Demo {
    public static void main(String[] args) throws
        Exception {
        // 第一种方式:调用Class.forName()
        Class clazz =Class.forName("java.lang.String");
        // 第二种方式:通过类的字节码文件来创建
        Class clazz1 = String.class;
        // 第三种方式:通过调用对象的getClass()方法来创建
        String str = new String();
        Class clazz2 = str.getClass();
        // 第四种:通过类装载器来创建
        ClassLoader loader =String.class.getClassLoader();
        Class<?> clazz3 =loader.loadClass("java.lang.String");
    }
}

以上がJavaにおけるリフレクションの意味と役割は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。