JAVA編程之——反射Reflect

說到反射,首先要說一下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();
        }
    }
    
}
相關文章
相關標籤/搜索