反射

来源:互联网 发布:4k电视直播软件 编辑:程序博客网 时间:2024/06/06 00:30

  反射:破坏了类的封装性,但有不得不说他可以是任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能就是反射。

public class Student {    private String name;    private int age;    private String address;    private long registTime;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getAddress() {        return address;    }    public void setAddress(String address) {        this.address = address;    }    public long getRegistTime() {        return registTime;    }    public void setRegistTime(long registTime) {        this.registTime = registTime;    }    @Override    public String toString() {        return "Student{" +                "name='" + name + '\'' +                ", age=" + age +                ", address='" + address + '\'' +                ", registTime=" + registTime +                '}';    }}

public static void main(String[] args) {        Student stu1=new Student();        stu1.setName("sxl");        stu1.setAge(26);        stu1.setAddress("中国");        long time=System.currentTimeMillis();        stu1.setRegistTime(time);        reflectBo.getStudentInfo(stu1);    }

    //读取私有属性值    public static  void getStudentInfo(Object obj){        PropertyDescriptor pd=null;        Field[] prifields=obj.getClass().getDeclaredFields();//获取该类的私有属性//        Field[] pubfields=cls.getFields();//获取该类及其父类的共有属性。        for(Field field:prifields){   //循环遍历获取字段字段//            field.setAccessible(true); //设置是否可以访问私有属性            try {//                System.out.println(field.get(obj)); //直接获取对象属性的值。(不推荐使用)                pd = new PropertyDescriptor(field.getName(), obj.getClass()); //获取属性字段对应的get,set方法                Method getMethod=pd.getReadMethod(); //获取get方法                Object retValue = getMethod.invoke(obj); //代理当前属性对应的get方法。                System.out.println(retValue);            } catch (Throwable e) {                e.printStackTrace();            }        }    }    

 public static void main(String[] args) {        Student stu2=new Student();        long time=System.currentTimeMillis();        Map<String,Object> map=new HashMap<String,Object>();        map.put("name","xiaolin");        map.put("age",27);        map.put("address","河北");        map.put("registTime",time);        reflectBo.setStudentInfo(stu2,map);    }
    //设置私有属性值    public static  void setStudentInfo(Object obj, Map<String,Object> map){        PropertyDescriptor pd=null;        Field[] prifields=obj.getClass().getDeclaredFields();//获取该类的私有属性        for(Field field:prifields){   //循环遍历获取字段字段            try {                field.setAccessible(true);//是否可以访问私有属性                pd = new PropertyDescriptor(field.getName(), obj.getClass()); //获取属性字段对应的get,set方法                Method setMethod=pd.getWriteMethod(); //获取get方法                if(map.containsKey(field.getName())){                    setMethod.invoke(obj,map.get(field.getName()));                }            } catch (Throwable e) {                e.printStackTrace();            }        }        System.out.println(obj.toString());    }






原创粉丝点击