反射和工廠模式

Java反射java

反射就是把Java類中的各個成分映射成一個個的Java對象,即在運行狀態中,對於任意一個類,都可以知道這個類的因此屬性和方法;對於任意一個對象,都能調用它的任意一個方法和屬性。數組

動態獲取信息及動態調用對象方法的功能叫Java的反射機制。spa

主要由如下的類來實現反射機制(這些類都位於java.lang.reflect包中):對象

  • Class類:表明一個類。 Field類:表明類的成員變量(成員變量也稱爲類的屬性)。blog

  • Method類:表明類的方法。接口

  • Constructor類:表明類的構造方法。get

  • Array類:提供了動態建立數組,以及訪問數組的元素的靜態方法。

Class類是Reflection API中的核心類,主要方法以下:io

  • getName():得到類的完整名字。 getFields():得到類的public類型的屬性。class

  • getDeclaredFields():得到類的全部屬性。泛型

  • getMethods():得到類的public類型的方法。

  • getDeclaredMethods():得到類的全部方法。

  • getMethod(String name, Class[] parameterTypes):得到類的特定方法,name參數指定方法的名字,parameterTypes參數指定方法的參數類型。

  • getConstrutors():得到類的public類型的構造方法。

  • getConstrutor(Class[] parameterTypes):得到類的特定構造方法,parameterTypes參數指定構造方法的參數類型。

  • newInstance():經過類的不帶參數的構造方法建立這個類的一個對象。

 

工廠模式

工廠模式分爲三種:

  • 簡單工廠模式(Simple Factory)
  • 工廠方法模式(Factory Method)
  • 抽象工廠模式(Abstract Factory)

簡單工廠:

interface Car {
    public void Name();
}

class Aodi implements Car {
    public void Name() {
        System.out.println("Aodi");
    }
}

class Aotuo implements Car {
    public void Name() {
        System.out.println("Aotuo");
    }
}

class Factory{
    private Factory() {}
    public static Car getInstance(String className) {
        if("Aodi".equalsIgnoreCase(className)) {
            return new Aodi();
        }else if("Aotuo".equalsIgnoreCase(className)) {
            return new Aotuo();
        }
        return null;
    }
}

public class Test {
    public static void main(String[] args) throws Exception {
        Car car = Factory.getInstance("Aodi");
        car.Name();
    }
}

引入反射機制,工廠模式:

class Factory2 {
    private Factory2() {}
    public static Car getInstance(String className) {
        Car instance = null;
        try {
            instance = (Car) Class.forName(className).getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return instance;
    }
}

public class Test2 {
    public static void main(String[] args) throws Exception {
        Car car = Factory2.getInstance("sample.Aodi");
        car.Name();
    }
}

也能夠用泛型解決,抽象工廠:

class Factory3 {
    private Factory3() {}
    @SuppressWarnings("unchecked")
    //instanceName 接口的子類   className接口的類型
    public static <T> T getInstance(String instanceName, Class<T> className ) {
        T instance = null;
        try {
            instance = (T) Class.forName(instanceName).getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return instance;
    }
}

public class Test3 {
    public static void main(String[] args) throws Exception {
        Car car = Factory3.getInstance("sample.Aodi", Car.class);
        car.Name();
    }
}
相關文章
相關標籤/搜索