記java反射機制的學習

動態獲取信息以及調用類中的方法和屬性的功能成爲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();
	}
}

這裏面還用到了多態,父類引用指向子類使代碼複用性提升。對象

 

總結:有的程序是不讓你修改源碼的,因此只有經過修改配置文件的修改來建立不一樣的對象。源碼

相關文章
相關標籤/搜索