从文件中读取内容设置为对象的方法

来源:互联网 发布:女生学php好找工作吗 编辑:程序博客网 时间:2024/05/19 15:44

通过反射的机制

反射的讲解

  • 反射:通过class文件对象,去使用该文件的成员变量,构造方法,成员方法。
  • 首先必须先得到一个class文件对象
    class类的内容:成员变量 Field 构造方法 Constructor 成员方法Method
    获得class文件的方法:通过Class文件提供的静态方法
    public static Class forName(String className)
    -获取到构造方法并且使用

     //获取字节码文件对象 Class c = class.forName("cn.itcast_01.Person"); //获取单个构造方法 Constructor com = c.getConstructor(); //public T newInstance(Object... initargs) //使用此Constructor 对象表示的构造方法来创建一个实例 Object obj= con.newInstance(); System.out.println(obj);//获取带参数的构造方法    Constructor con = c.getConstructor(String.class, int.class,     String.class);//使用带参数的构造方法创建对象    Object obj = con.newInstance("潇洒", 27, "差别科技部");//通过反射获取私有构造方法并使用    Constructor con = c.getDeclaredConstructor(String.class);    con.setAccessible(true); //无视private    Object obj = con.newInstance("擦");
  • 通过反射获取成员变量
    “`
    //获取字节码文件对象
    Class c = class.forName(“cn.itcast_01.Person”);
    //通过无参数构造方法创建对象
    Constructor con = c.getConstructor();
    Object o = con.newInstance();
    //获取单个成员变量
    Field addressField = c.getField(“address”);
    //public void set(Object obj, Object value)
    addressField.set(obj, “北京”);//给obj对象的addressField字段设置为北京

//获取age字段并赋值
Field ageField = c.getField(“age”);
ageField.setAccessible(true);
ageField.set(obj, 27);
“`

  • 使用一个方法
    *第一 创建字节码文件对象c
    第二 通过字节码文件对象获取构造方法
    第三 通过构造方法 创建一个对象的实例obj
    第四 通过字节码对象调用getMethod()方法m1
    第五 m1.invoke(obj,String.class) 调用obj对象的m1方法
    *

  • 创建一个类Person

package cn.itcast.introspector;//实体类---javaBeanpublic class Person {     int id;     String name;    public Person(int id, String name) {        super();        this.id = id;        this.name = name;    }    public Person(){}    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public String toString() {        return "编号:"+ this.id+" 姓名:"+ this.name;    }}

读取配置文件

public class Demo1 {    public static void main(String[] args) throws Exception {        Person p = (Person) getInstance();        System.out.println(p);    }    //根据配置文件的内容生产对象的对象并且要把对象的属性值封装到对象中。    public static Object getInstance() throws Exception{        BufferedReader bufferedReader = new BufferedReader(new FileReader("obj.txt"));        String className =  bufferedReader.readLine(); //读取配置文件获取到完整的类名。        Class clazz = Class.forName(className);        //通过class对象获取到无参的构造方法        Constructor constructor = clazz.getDeclaredConstructor(null);        //创建对象        Object o  = constructor.newInstance(null);        //读取属性值        String line = null;        while((line = bufferedReader.readLine())!=null){            String[] datas = line.split("=");            //通过属性名获取到对应的Field对象。            Field field =   clazz.getDeclaredField(datas[0]);            if(field.getType()==int.class){                field.setAccessible(true);                field.set(o, Integer.parseInt(datas[1]));            }else{                field.setAccessible(true);                field.set(o, datas[1]);            }        }        return o;    }}
0 0
原创粉丝点击