動態獲取信息以及調用類中的方法和屬性的功能成爲java反射機制,說的通俗一點就是先經過反射來獲取字節碼文件,再經過字節碼來進行對象的建立。java
反射寫的代碼:ui
public static void main(String[] args) throws ClassNotFoundException, IOException, InstantiationException, IllegalAccessException { //將配置文件封裝成br對象 BufferedReader br = new BufferedReader(new FileReader("config2.properties")); //獲取字節碼文件 Class clazz = Class.forName(br.readLine()); //用字節碼文件來獲取Apple對象 Fruit f = (Fruit) clazz.newInstance(); f.squeeze(); } } interface Fruit2{ public void squeeze(); } class Apple2 implements Fruit{ public void squeeze() { System.out.println("蘋果汁"); } } class Banana2 implements Fruit{ public void squeeze() { System.out.println("香蕉醬"); } } class Juicer2{ public void run(Fruit f) { f.squeeze(); } }
配置文件爲:com.xy.test16.Apple2spa
經過配置文件來修改調用的類的好處是不用在源碼中改來改去。沒學反射以前要喝到不一樣的果汁就要修改源碼,學了反射後用配置文件修改配置文件包後的類名:code
public static void main(String[] args) { // TODO Auto-generated method stub Juicer j = new Juicer(); //j.run(new Apple()); j.run(new Banana()); } } //class Fruit{ // public void squeeze() { //System.out.println("汁"); // } //} interface Fruit{ public void squeeze(); } class Apple implements Fruit{ public void squeeze() { System.out.println("蘋果汁"); } } class Banana implements Fruit{ public void squeeze() { System.out.println("香蕉醬"); } } class Juicer{ public void run(Fruit f) { f.squeeze(); } }
這裏面還用到了多態,父類引用指向子類使代碼複用性提升。對象
總結:有的程序是不讓你修改源碼的,因此只有經過修改配置文件的修改來建立不一樣的對象。源碼