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; } }