Javaのリフレクションとは何ですか?

angryTom
リリース: 2019-11-11 10:04:08
オリジナル
5554 人が閲覧しました

Javaのリフレクションとは何ですか?

#リフレクションとは何ですか?

主に、プログラムが自身のステータスや動作にアクセス、検出、変更する機能を指します。

Java リフレクションとは何ですか?

Java リフレクションとは、Java プログラムの実行状態で、任意のクラスについて、このクラスのすべてのプロパティとメソッドを取得でき、特定のオブジェクトについては、すべてのプロパティとメソッドを取得できることを意味します。そのプロパティとメソッドのいずれかを呼び出すことができます。このようにクラスの内容を動的に取得し、オブジェクトを動的に呼び出す方法をリフレクション機構と呼びます。

Java リフレクション メカニズムは、主に次の機能を提供します。

* 1. 実行時にオブジェクトが属するクラスを決定します。

* 2. 実行時に任意のクラスのオブジェクトを構築します。

* 3. 実行時に任意のクラスのメンバー変数とメソッドを決定します。

#* 4. 実行時に任意のオブジェクトのメソッドを呼び出します。

Java のリフレクション メカニズムは、主にクラスの機能を分析するために使用され、実行時にプログラムまたはアセンブリ内のメンバーおよび各型のメンバーに関する情報を取得できます。プログラム内の一般的なオブジェクト タイプはコンパイル中に確認され、Java のリフレクション メカニズムによりオブジェクトを動的に作成し、実行時にそのプロパティを呼び出すことができます。したがって、リフレクションの核心は、実行時にクラスを動的にロードするかメソッドを呼び出してプロパティにアクセスすることであり、実行中のオブジェクトが誰であるかを事前に知る必要はありません。

リフレクションは次の目的で使用できます:

実行時に任意のクラスのオブジェクトを構築する任意のオブジェクトが属するクラス/特定のオブジェクトのインスタンスであるかどうかを決定する実行時にクラスを取得します。実行時に任意のオブジェクトのメソッドを呼び出す継承されたパブリック メソッドを含む、任意のクラスのプロパティとメソッドを取得します。

例:

a) Get メソッド

ルーチン DumpMethods クラスは、Reflection API の基本的な役割を示します。クラス名を読み取り、次に、このクラスのメソッド情報を出力します。

import java.lang.reflect.Method;
 
public class DumpMethods
{
    public static void main(String[] args) throws Exception //在方法后加上这句,异常就消失了
    {
        //获得字符串所标识的类的class对象
        Class<?> classType = Class.forName("java.lang.String");//在此处传入字符串指定类名,所以参数获取可以是一个运行期的行为,可以用args[0]
 
        //返回class对象所对应的类或接口中,所声明的所有方法的数组(包括私有方法)
        Method[] methods = classType.getDeclaredMethods();
 
        //遍历输出所有方法声明
        for(Method method : methods)
        {
            System.out.println(method);
        }
    }
 
}
ログイン後にコピー

b) リフレクションによるメソッドの呼び出し

import java.lang.reflect.Method;
 
public class InvokeTester
{
    public int add(int param1, int param2)
    {
        return param1 + param2;
 
    }
 
    public String echo(String message)
    {
        return "Hello: " + message;
    }
 
    public static void main(String[] args) throws Exception
    {
 
        // 以前的常规执行手段
        InvokeTester tester = new InvokeTester();
        System.out.println(tester.add(1, 2));
        System.out.println(tester.echo("Tom"));
        System.out.println("---------------------------");
 
        // 通过反射的方式
 
        // 第一步,获取Class对象
        // 前面用的方法是:Class.forName()方法获取
        // 这里用第二种方法,类名.class
        Class<?> classType = InvokeTester.class;
 
        // 生成新的对象:用newInstance()方法
        Object invokeTester = classType.newInstance();
        System.out.println(invokeTester instanceof InvokeTester); // 输出true
 
        // 通过反射调用方法
        // 首先需要获得与该方法对应的Method对象
        Method addMethod = classType.getMethod("add", new Class[] { int.class,
                int.class });
        // 第一个参数是方法名,第二个参数是这个方法所需要的参数的Class对象的数组
 
        // 调用目标方法
        Object result = addMethod.invoke(invokeTester, new Object[] { 1, 2 });
        System.out.println(result); // 此时result是Integer类型
 
        //调用第二个方法
        Method echoMethod = classType.getDeclaredMethod("echo", new Class[]{String.class});
        Object result2 = echoMethod.invoke(invokeTester, new Object[]{"Tom"});
        System.out.println(result2);
 
    }
}
ログイン後にコピー

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート