zoukankan      html  css  js  c++  java
  • Java 内省机制

    一、内省

      内省(Introspector) 是Java 语言对 JavaBean 类属性、事件的一种缺省处理方法。JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”,方法比较少,这些信息储存在类的私有变量中,通过set()、get()获得,如下所示:

     1 public class Student {    
     2     public Student(){
     3         System.out.println("调用构造Student方法");
     4     }
     5     public Student(int age,String name){
     6         this.age=age;
     7         this.name = name;
     8     }    
     9     private int age;
    10     private String name;
    11     public int getAge() {
    12         return age;
    13     }
    14     public void setAge(int age) {
    15         this.age = age;
    16     }
    17     public String getName() {
    18         return name;
    19     }
    20     public void setName(String name) {
    21         this.name = name;
    22     }
    23 }
    View Code

        在类Person中有属性name, 那我们可以通过 getName,setName来得到其值或者设置新的值,通过getName/setName来访问userName属性,这就是默认的规则。Java JDK中提供了一套 API用来访问某个属性的 getter/setter 方法,这就是内省。

    JDK内省类库:PropertyDescriptor类:

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

    具体实例如下所示:

     1  Student st = new Student(23,"崔颖");
     2  String propertyName = "age";
     3 //1.通过构造器来创建PropertyDescriptor对象
     4  PropertyDescriptor pd = new PropertyDescriptor("name", Student.class);
     5  PropertyDescriptor pd2 = new PropertyDescriptor("age",Student.class);
     6  //2.通过该对象来获得写方法
     7  Method method1= pd.getReadMethod();
     8  method2= pd2.getReadMethod();
     9 //3.执行写方法
    10  Object object=method1.invoke(st);
    11  Object object2 = method2.invoke(st);
    12  //4.输出对象字段的值
    13  System.out.println(object);
    14  System.out.println(object2);
    15   /*//5.通过对象获得读方法
    16  method = pd.getReadMethod();
    17  //6.执行读方法并定义变量接受其返回值并强制塑形
    18  String name = (String) method.invoke(st, null);
    19  //7.输出塑形后的值
    20  System.out.println(name);*/
    21     }
    View Code

    在上面示例中,通过属性描述类获得读取属性以及写入属性的方法,进而可以对JavaBean的属性进行读取操作。 

      还有一种做法是通过类Introspector的getBeanInfo()方法获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的 getter/setter方法,然后我们就可以通过反射机制来调用这些方法。我们又通常把javabean的实例对象称之为值对象(Value Object),因为这些bean中通常只有一些信息字段和存储方法,没有功能性方法,JavaBean实际就是一种规范,当一个类满足这个规范,这个类就能被其它特定的类调用。一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量,通过去掉set方法前缀,然后取剩余部分,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小写。

     1 public static void test2() throws Exception{
     2            Student student = new Student();
     3            //1.通过Introspector来获取bean对象的beaninfo 
     4            BeanInfo bif = Introspector.getBeanInfo(Student.class);
     5            //2.通过beaninfo来获得属性描述器(propertyDescriptor) 
     6            PropertyDescriptor pds[] = bif.getPropertyDescriptors();
     7            //3.通过属性描述器来获得对应的get/set方法
     8            for(PropertyDescriptor pd:pds){
     9                   //4.获得并输出字段的名字
    10                   System.out.println(pd.getName());
    11                   //5.获得并输出字段的类型
    12                   System.out.println(pd.getPropertyType());
    13                   if(pd.getName().equals("name")){
    14                          //6.获得PropertyDescriptor对象的写方法
    15                          Method md = pd.getWriteMethod();
    16                          //7.执行写方法
    17                          md.invoke(student, "sunfei");
    18                   }
    19            }
    20            //8.输出所赋值字段的值
    21            System.out.println(student.getName());
    22        }
    View Code
  • 相关阅读:
    Unity3D之如何将包大小减少到极致
    3DMAX 如何将删去的面补回来
    3DMAX 7 角色建模1 人头建模
    Unity json
    unity资源管理
    unity 引入 android第三方sdk
    unity调用Android的jar包
    Unity3D游戏开发之Unity与Android交互调用研究
    unity3d easytouch教程
    Unity手游之路游戏摇杆之Easy Touch 3教程
  • 原文地址:https://www.cnblogs.com/sunfie/p/4350941.html
Copyright © 2011-2022 走看看