• java内省机制


    一、概念

    内省(Introspector) 是Java 语言对 JavaBean 类属性、事件的一种缺省处理方法。

      JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”。方法比较少。这些信息储存在类的私有变量中,通过set()、get()获得。通俗地讲,每一对set/get方法都是对应的javaBean的一个属性, 内省就是对这些属性进行操作,与反射作用相仿。

    二、API方法

    PropertyDescriptor类:

      PropertyDescriptor类表示JavaBean类通过存储器导出一个属性。主要方法:
          1. getPropertyType(),获得属性的Class对象;
          2. getReadMethod(),获得用于读取属性值的方法;getWriteMethod(),获得用于写入属性值的方法;
          3. hashCode(),获取对象的哈希值;
          4. setReadMethod(Method readMethod),设置用于读取属性值的方法;
          5. setWriteMethod(Method writeMethod),设置用于写入属性值的方法。

    三、举个例子

    先列一个bean出来

    public class ClassInfo implements Serializable {
        private String             classId;
        private String             className;
        private TeacherBean        teacher;
    public void setName(){
        }
        public String getClassId() {
            return classId;
        }
    
        public void setClassId(String classId) {
            this.classId = classId;
        }
    
        public String getClassName() {
            return className;
        }
    
        public void setClassName(String className) {
            this.className = className;
        }
    
        public TeacherBean getTeacher() {
            return teacher;
        }
    
        public void setTeacher(TeacherBean teacher) {
            this.teacher = teacher;
        }
    }

    我们先看看上面到底有多少个属性呢?根据定义,很明显的答案就是4个,但是其实他有5个属性,看下面

    BeanInfo beanInfo = Introspector.getBeanInfo(ClassInfo.class);
            PropertyDescriptor[] pds = info.getPropertyDescriptors();
            for (PropertyDescriptor pd:pds){
                System.out.println(pd.getName());
            }
    
    答案:
    classId
    className
    teacher
    name
    class

    为什么会多了一个class属性呢,原因很简单,每个java类都继承了Object类,而Object就有一个属性class。那可不可以不让父类的属性出现呢,答案是肯定的,而且只需在取Beaninfo的时候多加一个父类的参数就可以了

    BeanInfo beanInfo = Introspector.getBeanInfo(ClassInfo.class,Object.class);

    这个时候获取到的属性就全部是当前类的属性了。在得到PropertyDescriptor(属性描述符)后,接下来我们就可以对其属性进行修改和获取了。

    ClassInfo c = new ClassInfo();
    PropertyDescriptor pd = new PropertyDescriptor("classId",ClassInfo.class);
    Method method = pd.getWriteMethod();   //相当于调用setClassid()方法
    method.invoke(c,"233");   //
    
    //获取属性的值
    Method method = pd.getReadMethod();   //相当于调用getClassid()方法
    method.invoke(c,null); //第二个参数表示为null表示无参   
  • 相关阅读:
    java枚举类的常见用法
    Sublime Text 3 3126 安装+注册码
    XtraFinder
    WinForm多线程+委托防止界面假死
    Win10添加简体中文美式键盘的方法
    查看sqlserver版本
    C#,PHP对应加密函数
    PHP文件缓存实现
    √GMAP.NET 地图
    JSON C# Class Generator ---由json字符串生成C#实体类的工具
  • 原文地址:https://www.cnblogs.com/lovemo1314/p/7103344.html
Copyright © 2020-2023  润新知