說到反射,首先要說一下Java中的類和對象。java
在Java中萬事萬物皆對象(有兩個 例外,一個是普通數據類型,另外一個是靜態的東西,靜態的東西不是對象的,是屬於類的)。函數
在Java中,類也是對象,類是java.lang.class類的實例對象,即所謂There is a class named Class。spa
如下代碼說明了Java中Class類的實例對象的三種表達方式excel
package org.guyezhai.reflect; public class ClassDemo1 { public static void main(String[] args) { // Foo的對象如何表示 Foo foo1 = new Foo(); // Foo這個類 也是一個實例對象,Class類的實例對象 // 任何一個類都是Class類的實例對象,這個實例對象有三種表示方式 // 第一種表示方式,任何一個類都有一個隱含的靜態成員變量class Class c1 = Foo.class; // 第二種表達方式,已經知道該類的對象,經過getClass()方法 Class c2 = foo1.getClass(); // 官網中,c一、c2表示了Foo類的類類型(class type) // 萬事萬物皆對象,類也是對象是Class類的實例對象,稱爲該類的類類型 // c1和c2都表明了Foo類的類類型,一個類只多是Class類的一個實例對象 System.out.println(c1 == c2);//true // 第三種表達方式 Class c3 = null; try { c3 = Class.forName("org.guyezhai.reflect.Foo"); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println(c2 == c3);//true // 咱們徹底能夠經過類的類類型,建立該類的對象實例:經過c一、c二、c3建立Foo的實例 try { Foo foo = (Foo) c1.newInstance();// 須要有無參構造函數 foo.print(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } class Foo { void print() { System.err.println("foo"); } }
java中的類加載分爲靜態加載類和動態加載類兩種,先來一個靜態加載類的例子:code
package org.guyezhai.reflect; public class Office { /** * @param args */ public static void main(String[] args) { if ("Word".equals(args[0])) { // new對象是靜態加載類,在編譯時刻就須要加載全部的可能使用到的類 // 經過動態加載類能夠解決該問題 Word w = new Word(); w.start(); } if ("Excel".equals(args[0])) { // Excel類不存在,編譯不經過 // Excel e = new Excel(); // e.start(); } } }
這種加載方式是咱們經常使用的,可是有一個問題,若是Word類或Excel類有一個不存在,就會編譯不經過,致使整個程序沒法運行。對象
在某些狀況下這也許不是咱們想要的,咱們但願只要Word或Excel中任一個存在就可使用,這就須要改成動態加載類方式,代碼以下:blog
首先建立一個接口officeAble:接口
package org.guyezhai.reflect; public interface OfficeAble { public void start(); }
而後讓Word和Excel類實現OfficeAble接口:get
package org.guyezhai.reflect; public class Word implements OfficeAble { public void start() { System.out.println("word...start()"); } }
package org.guyezhai.reflect; public class Excel implements OfficeAble { public void start() { System.out.println("excel...start()"); } }
這樣就能夠動態加載Word或Excel了:io
package org.guyezhai.reflect; public class officeBetter { /** * @param args */ public static void main(String[] args) { try { // 動態加載類,在運行時刻加載 Class c = Class.forName(args[0]); // 經過類類型,建立該類的對象 OfficeAble oa = (OfficeAble) c.newInstance(); oa.start(); } catch (Exception e) { e.printStackTrace(); } } }