Javaリフレクションメカニズムに基づくビッグファクトリーのインタビューの質問

Javaリフレクションメカニズムに基づくビッグファクトリーのインタビューの質問

反射メカニズムの概念

プログラムの実行中、 Javaリフレクションメカニズムは、任意のクラスのこのクラスのすべてのプロパティとメソッドを認識できます。任意のオブジェクトの場合、任意のメソッドとプロパティを呼び出すことができます。この情報への動的アクセスおよび動的呼び出しオブジェクトのための方法と呼ばれる機能Javaリフレクション機構

リフレクションの概念を導入する理由

上記の概念を理解していると思いますが、動的な情報の取得動的な呼び出しオブジェクトメソッドの黒い疑問符は頭に浮かびません次の簡単なコードは、iの開始点として機能し、Java仮想マシンの観点から説明されています

  • 次のコードを書きます
public class Main{
    public static int number = 1;
    public static void main(String args[]) {
    	System.out.println("hello World");
    }
}
  • javac Main.javaコマンドを呼び出してファイルをファイルMain.javaにコンパイルしMain.classます
  • java Mainコマンドを実行すると、Java仮想マシンが起動し、クラスのロードプロセスが実行され、クラスの静的ストレージ構造がメソッド領域に格納され、クラスを表すjava.lang.Classオブジェクトがメソッド領域の各クラスとしてメモリに生成されます。データアクセス

それ以上のプロセスを示しコンパイル段階では、それが明確なクラスのJava仮想マシンは、(メインカテゴリ)にロードされてきたプログラムが実行されている場合、クラスが突然、リモートサーバ(実行中の負荷)をロードするために、この時間必要反射ステージ上での

データベースドライバークラスをロードするという非常に古典的なシナリオがあります。実行時にパラメーターを介してのみ、ロードcom.java.dbtest.myqlConnection(mysqlドライバークラス)かロードするかを決定できます。com.java.dbtest.oracleConnection

この時点でClass.forName(com.java.dbtest.myqlConnection)は、クラスをロードするプロセスを動的に完了することができるのは、単純な呼び出しだけです。

リフレクションメカニズムを使用してクラスを2回ロードする

import java.io.IOException;
import java.io.InputStream;
public class Main{
    public static void main(String args[]) throws Exception{
        //自定义类加载器
        ClassLoader myLoader = new ClassLoader() {
            @Override
            public Class<?> loadClass(String name) throws ClassNotFoundException{
                try{
                    String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
                    InputStream is = getClass().getResourceAsStream(fileName);
                    if(is == null) {
                        return super.loadClass(name);
                    }
                    byte[] b = new byte[is.available()];
                    is.read(b);
                    return defineClass(name, b, 0,  b.length);
                }catch(IOException e) {
                    throw new ClassNotFoundException(name);
                }
            }
        };
        //使用反射机制加载并实例化
        Object obj = myLoader.loadClass("Main").newInstance();

        System.out.print(obj instanceof Main);

    }
}

//结果为false

最初のステージが渡された双亲委派模型ため、システムアプリケーションのクラスローダーは既にクラスをロードしています。実行時のステージでは、カスタムクラスローダーが使用されます。リフレクションメカニズムに基づいて、クラスが再度ロードされます。2つの異なるクラスローダーが再度ロードされます。 、それでプログラムの最終結果は偽です。

彼は193元の記事を発表 ウォンの賞賛403 ビュー15万+

おすすめ

転載: blog.csdn.net/zycxnanwang/article/details/105525658