java反射學習筆記(2)----java中的靜態載入類和動態載入類
阿新 • • 發佈:2019-01-25
首先我們要了解java中的編譯和執行的兩個概念,我們在初學java的時候都學過,我們會先寫一個Test.java檔案,然後javac Test.java,最後在java Test 。這其中的javac就是在編譯這個.java檔案,java命令就是在執行編譯後的檔案。
1、靜態載入類
瞭解了編譯和執行的連個概念後,我們就可以去學習靜態和動態載入類了,其中,靜態載入類就是使用new運算子去建立一個物件,在編譯的時候去進行載入,這就是類的靜態載入,編譯的時候,會載入java檔案中所有的類。這個時候如果其他的類有問題,那麼沒有問題的累也不回去執行。我們用一段程式碼來進行說明:
public class Test{
public static void main(String []args){
if(arg[0].equals("A")){
A a = new A();
a.print_info();
}else if(arg[0].equals("B")){
B b = new B();
b.print_info();
}
}
}
class A{
public void print_info(){
System.out .println("i am a...");
}
}
class B{
public void print_info(){
System.out.println("i am b...");
}
}
上述程式碼中,如果我們在編譯的時候,沒有建立A類或者B類,就會報錯。那麼我們在實際的開發過程中,如果只想使用java Test A來呼叫A的功能,但是在判斷的時候又不能將B的這種情況給省略掉,那麼我們就不能用這種靜態載入的方法了。我們要是用動態載入類方式來載入Test類。
2、動態載入類
使用動態載入類,在編譯的時候不會因為上述問題而報錯,只有在執行的時候,才會去報相應的錯誤,我們通過程式碼來演示:
public class Test{
public static void main(String []args){
Class c = Class.forName(args[0]);//動態載入類,在執行的時刻載入
Able ab = (Able)c.newInstance();//通過c(class type)來建立例項化物件,不過這個例項化物件,是我們通過args[0]讀進來的引數類的物件,不是這裡的Able。
c.print_Info();
}
}
interface Able{
public void print_Info();
}
class A implements Able{
public void print_info(){
System.out.println("i am a...");
}
}
class B implements Able{
public void print_info(){
System.out.println("i am b...");
}
}
我們在上述的動態載入的方法中,在main方法中,通過Class來讀取引數中的類的class type,然後再通過newInstance()方法來建立該類的物件,然後用介面的引用來指向這個物件,進而實現相應的具體的方法實現,而不會出現我們之前靜態載入時與到的問題。