Java反射java
反射就是把Java類中的各個成分映射成一個個的Java對象,即在運行狀態中,對於任意一個類,都可以知道這個類的因此屬性和方法;對於任意一個對象,都能調用它的任意一個方法和屬性。數組
動態獲取信息及動態調用對象方法的功能叫Java的反射機制。spa
主要由如下的類來實現反射機制(這些類都位於java.lang.reflect包中):對象
Class類:表明一個類。 Field類:表明類的成員變量(成員變量也稱爲類的屬性)。blog
Method類:表明類的方法。接口
Constructor類:表明類的構造方法。get
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():經過類的不帶參數的構造方法建立這個類的一個對象。
工廠模式
工廠模式分爲三種:
簡單工廠:
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(); } }