反射技术在工厂设计模式中的应用

package leotoneo;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

/*//学习反射技术后,感觉为什么要引入这一个技术:创建个对象那么麻烦,调用个方法那么麻烦,修改个属性那么麻烦(重要的事情说三遍)。
直到,看到一些对象的配置文件之后,原来才知道,反射技术可以直接通过配置文件来读取一些类的属性、方法,并且创建类的对象。
今天想结合简单的工厂模式中运用的反射方法来自己熟练一下反射技术和工厂设计模式。

举个富士康生产手机的例子:
*/
//定义一个手机接口类
interface Phone{
	public void brand();
}
//定义小米手机类
class MiPhone implements Phone{

	String name;
	public MiPhone(){}
	public MiPhone(String name){
		this.name = name;
	}
	@Override
	public void brand() {
		System.out.println(this.name+"手机");
		
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return this.name;
	}
}
//定义苹果手机类
class IPhone implements Phone{

	String name;
	public IPhone(){}
	public IPhone(String name){
		this.name = name;
	}
	@Override
	public void brand() {
		// TODO Auto-generated method stub
		System.out.println(this.name+"手机");
	}
	public String toString() {
		// TODO Auto-generated method stub
		return this.name;
	}
}
public class FactoryReflect {
	public static void main(String[] args){
		//生产一台小米手机
		Phone MiPhone = createPhone("src/infoMi.txt");
		MiPhone.brand();;
		//生产一台苹果手机
		Phone IPhone = createPhone("src/infoApple.txt");
		IPhone.brand();
	}
	//工厂模式的实质就是 :定义一个静态的方法去创建对象
	public static Phone createPhone(String string){
		Phone xPhone = null;
		try {
			//定义输入缓冲流,为了是读取配置文件中的内容
			BufferedReader bufferedReader = new BufferedReader(new FileReader(string));
			//读取第一行内容    : 包名.类名
			String line = bufferedReader.readLine();
			//获取类的字节码对象
			Class phoneClass = Class.forName(line);
			//获取类的构造方法
			Constructor  phoneConstructor = phoneClass.getConstructor(null);
			//创建类的对象
			xPhone =(Phone) phoneConstructor.newInstance(null);
			//依次读取配置文件中的其他配置信息
			while((line =bufferedReader.readLine())!=null){
				//以等号为分隔符 对属性的设置进行拆分  
				String[] datas = line.split("=");
				//得到属性变量名
				Field f = phoneClass.getDeclaredField(datas[0]);
				//获取访问权限
				f.setAccessible(true);
				//判断属性的变量类型
				if(f.getType() == String.class){
					//将配置文件中设置的值赋值给属性变量
					f.set(xPhone, datas[1]);
				}else{
					f.set(xPhone, Integer.parseInt(datas[1]));
				}
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return xPhone;
		
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值