最近在学Java基础,记录一下学习内容,本案例来源尚硅谷,题目要求如下:
实现榨汁机榨水果汁,水果分别有苹果(Apple)、香蕉(Banana)、桔子(Orange)等。
1. 声明(Fruit)水果接口,包含榨汁抽象方法:void squeeze();
2. 声明榨汁机(Juicer),包含运行方法:public void run(Fruit f),方法体中,调用f的榨汁方法;
3. 声明各种水果类,实现水果接口,并重写squeez();
4. 在src下,建立配置文件:config.properties,并在配置文件中配上fruitName=xxx(其中xxx为某种水果的全类名);
5. 在FruitTest测试类中,
(1) 读取配置文件,获取水果类名,并用反射创建水果对象,
(2) 创建榨汁机对象,并调用run()方法。
题目要求是蛮基础的,但是涉及了IO流、properties和反射,感觉有点意思,记录一下。
1-3的代码很简单,就是造类,不多赘述。
在4里面我犯了一个错误,对于配置文件的书写不熟悉,fruitName=xxx这段的xxx外边加了双引号。
5的代码如下:
public class FruitTest{
@Test
public void test() throws Exception {
//1. 读取配置文件中的信息,获取全类名
FileInputStream fis = new FileInputStream(new File("src/config.properties"));
Properties pros = new Properties();
pros.load(fis);
String fruitName = pros.getProperty("fruitName");
//2. 通过反射,创建指定全类名对应的实例
Class clazz = Class.forName(fruitName);//获取class类的实例,即加载到内存中的某个类
Constructor cons = clazz.getDeclaredConstructor();
cons.setAccessible(true);
Fruit o = (Fruit) cons.newInstance();//调用构造器造对象
//3. 通过榨汁机的对象调用run()
Juicer juicer = new Juicer();
juicer.run(o);
}
}
自己在写的时候还遇到一些问题:
1. 首先还是对配置文件不熟悉,对properties类的方法不熟,在确定Class.forname()方法的参数时,没有想到使用properties的getProperties()方法;
2. 这段代码的健壮性不是很强,应该是可以使用泛型优化的,但是我泛型太久没用又忘了(悲)。