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