java反射_01,java_01
為什麼要用反射?
舉個栗子:
package com.imooc.reflect;public class Work { // 定義一個word方法 public void word() { System.out.println("厲害了word哥"); }}
package com.imooc.reflect;public class Word { public static void main(String[] args) { Work work = new Work(); work.word(); // 厲害了word哥 work.excel(); // 報錯,因為work類中沒有這個方法 }}
我們希望既然定義了word方法就能使用該方法,而不受是否有excel()方法的影響。
反射的作用就是避開編譯期不通過的影響,運行期需要調用word()方法就能調用,不用管excel()方法是否存在。
編譯時間刻載入類是靜態載入類、運行時刻載入類是動態載入類。
動態載入類的三種方式:
1 package com.imooc.reflect; 2 3 public class ClassDemo1 { 4 5 public static void main(String[] args) { 6 //Foo的執行個體對象如何表示 7 Foo foo1 = new Foo(); 8 //Foo這個類 也是一個執行個體對象,Class類的執行個體對象,如何表示呢 9 //任何一個類都是Class的執行個體對象,這個執行個體對象有三種表示方式10 11 //第一種表示方式--->實際在告訴我們任何一個類都有一個隱含的靜態成員變數class12 Class c1 = Foo.class;13 14 //第二中表達方式 已經知道該類的對象通過getClass方法15 Class c2 = foo1.getClass();16 17 /*18 * c1 ,c2 表示了Foo類的類類型(class type)19 * 萬事萬物皆對象,20 * 類也是對象,是Class類的執行個體對象21 * 這個對象我們稱為該類的類類型22 * 23 */24 25 //不管c1 or c2都代表了Foo類的類類型,一個類只可能是Class類的一個執行個體對象26 System.out.println(c1 == c2);27 28 //第三種表達方式29 Class c3 = null;30 try {31 c3 = Class.forName("com.imooc.reflect.Foo");32 } catch (ClassNotFoundException e) {33 // TODO Auto-generated catch block34 e.printStackTrace();35 }36 System.out.println(c3 == c2);37 38 //我們完全可以通過類的類類型建立該類的對象執行個體---->通過c1 or c2 or c3建立Foo的執行個體對象39 Foo foo;40 try {41 foo = (Foo)c1.newInstance();//需要有無參數的構造方法42 foo.print();43 } catch (InstantiationException e) {44 // TODO Auto-generated catch block45 e.printStackTrace();46 } catch (IllegalAccessException e) {47 // TODO Auto-generated catch block48 e.printStackTrace();49 }50 }51 }52 53 class Foo{54 void print() {55 System.out.println("hahahahahaha");56 }57 }
以上是自己在慕課網學習java反射的一點點理解,肯定不精準,只是為了快速理解反射。畢竟越簡單越方便入門。等自己達到一定水平再追求精確吧。希望讀到此篇的同學,不要太把本文太當真,理解就好。