package cn.itcast.factory;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import cn.itcast.reflect.Person;
/**
* 工厂设计模式就是用于产生对象的.
* @author zhongzh
*
*/
class Car{}
class BMW extends Car{}
class BSJ extends Car{}
public class Demo1 {
public static Car getInstance(int num){//工厂方法,这个方法专门用于产生对象的.
//专门用于生产对象的方法就是工厂方法.
if(num==0){
return new BMW();
}else{
return new BSJ();
}
}
//#以后配置信息都是写在XML文件上的.
public static void main(String[] args) throws Exception {
//你那工厂方法是根据我的配置文件生成对象的,任何对象都可以帮我创建.
//工厂方法能生成任意的对象.只要你在配置文件能写,我就能创建.
Person p = (Person) getInstance();
System.out.println(p);
}
//需求:编写一个工厂方法根据配置文件返回对应的对象.
//这个工厂方法可以产生任意的对象.除了反射别无他径.这就是反射的应用.
//如果想写通用的东西,通用的工具给别人使用,反射是必不可少的.
//任意的对象都可以帮我们随意的生成.
public static Object getInstance() throws Exception{//根据配置文件生成对应的对象,其实工厂方法是通用的.
//通用的东西缺少不了反射.
//FileReader fileReader = new FileReader("info.txt");//相对路径,文件在工程下
//读取配置文件
BufferedReader bufferedReader = new BufferedReader(new FileReader("info.txt"));
//读取第一行:读取类文件的信息.
//第一行是你要创建哪个类的对象.
//任何一个框架你都要学它的语法,这个语法就是它要定义的规则.任何一个框架都有它的规则.
//所以我要求第一行必须写完整的类名,它不写的话可以啊,你不用我的东西呗.
String className = bufferedReader.readLine();
//通过完整类名获取对应的Class对象
Class clazz = Class.forName(className);//在这里只能读字符串然后获取对应的字节码
//clazz.getConstructor(null);//有了字节码之后你就可以创建对象了.获取到对应的构造方法.
//没有无参的构造方法也不行.我在定义规则.以后你用Spring也是这样,别人也会这样要求你的,你也是必须
//得有构造方法.
Constructor constructor = clazz.getDeclaredConstructor(null);//防止它私有
constructor.setAccessible(true);
Object o = constructor.newInstance(null);
//给对象设置对应的属性值
String line = null;
while((line = bufferedReader.readLine())!=null){
//一行有属性名,也有属性值,切割呗
String datas[] = line.split("=");
Field field = clazz.getDeclaredField(datas[0]);//防止它私有,getDeclaredField
//设置它可以访问
field.setAccessible(true);
if(field.getType()==int.class){
field.set(o, Integer.parseInt(datas[1]));
}else{
field.set(o, datas[1]);
}
}
return o;
}
}
cn.itcast.reflect.Person
id=110
name=旺财
package cn.itcast.reflect;
import java.lang.reflect.Field;
/**
* 通过反射获取对应的成员变量
*
* 在反射技术中使用了Field类描述了成员变量的。
*
* @author zhongzh
*
*/
public class Demo4 {
public static void main(String[] args) throws Exception {
//获取到对应的Class对象
Class clazz = Class.forName("cn.itcast.reflect.Person");
//获取到所有的成员变量
//Field[] fields = clazz.getFields();//getFields()是获取公共的属性
/* Field[] fields = clazz.getDeclaredFields();//getFields()是获取公共的属性
for (Field field : fields) {
System.out.println(field);
}*/
Person p = new Person();
Field field = clazz.getDeclaredField("id");
//设置访问权限可以访问
field.setAccessible(true);
field.set(p,110);//set基本上是万能的.第一个参数:你是不是要给对象才能设置这个成员变量 设置该数据 的成员变量,第二个参数:属性值.
System.out.println(p);
}
}
package cn.itcast.reflect;
public class Person {
private int id;
//int id;//默认是私有的
//public int id;//默认是私有的
String name;
public Person(int id,String name){
this.id = id;
this.name = name;
}
public Person(){}
public void eat(int num){
System.out.println(name+"吃很"+num+"斤饭");
}
private static void sleep(int num){
System.out.println("明天睡上"+num+"小时");
}
public static void sum(int[] arr){
System.out.println("长度是:"+ arr.length);
}
@Override
public String toString() {
return " 编号:"+ this.id +" 姓名:"+ this.name;
}
}