欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java--内省

程序员文章站 2022-03-31 23:25:00
内省: 【转】 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则(但你最好还是要搞清楚),这些 API 存放于包 java.beans 中,一般的做法是通过类 Introspector 的 getBeanInfo方法 ......
  • 内省:
  1. Introspector类  是一个工具类,提供了一系列取得BeanInfo的方法;
  2. BeanInfo接口  对一个JavaBean的描述,可以通过它取得Bean内部的信息;
  3. PropertyDescriptor属性描述器类 对一个Bean属性的描述,它提供了一系列对Bean属性进行操作的方法

【转】 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则(但你最好还是要搞清楚),这些 API 存放于包 java.beans 中,一般的做法是通过类 Introspector 的 getBeanInfo方法 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法,这就是内省机制。

  • PropertyDescriptor类:

PropertyDescriptor类表示JavaBean类通过存储器导出一个属性。主要方法:
      1.  getReadMethod(),获得用于读取属性值的方法
      2.  getWriteMethod(),获得用于写入属性值的方法

public static void main(String[] args) throws Exception {
        
        Users users=new Users();
        users.setId("1");
        users.setUsername("aaaa");
        users.setPassword("123");
        //in是对一个Bean的描述,可以通过它取得Bean内部的信息
        BeanInfo in=Introspector.getBeanInfo(Users.class);
        //获得所有属性描述
        PropertyDescriptor[] p=in.getPropertyDescriptors();
        
        for (PropertyDescriptor pd: p) {
            Method method=pd.getReadMethod();
            method.getName();
            Object result = method.invoke(users) ;
            System.out.println(method.getName()+">>>>>"+result);
            System.out.println(p);
            System.out.println("----------------");
        }
        
    
    }

}

结果:

getClass>>>>>class cn.itcast.domian.Users
[Ljava.beans.PropertyDescriptor;@1430b5c
----------------
getId>>>>>1
[Ljava.beans.PropertyDescriptor;@1430b5c
----------------
getPassword>>>>>123
[Ljava.beans.PropertyDescriptor;@1430b5c
----------------
getUsername>>>>>aaaa
[Ljava.beans.PropertyDescriptor;@1430b5c
----------------

    public static void main(String[] args) throws Exception {
        
        Users users=new Users();
        users.setId("1");
        users.setUsername("aaaa");
        users.setPassword("123");
        
        PropertyDescriptor p2=new PropertyDescriptor("username", Users.class);//获得name属性的属性描述器
        //得到name属性的getter方法
         Method readMethod=p2.getReadMethod();
         //执行getter方法,获取返回值,即name属性的值
         String result = (String) readMethod.invoke(users,args);
         System.out.println(result);
         //得到name属性的setter方法
         Method writeMethod =p2.getWriteMethod() ;
         //执行setter方法,修改name属性的值
          writeMethod.invoke(users, "bbbb");
         System.out.println(users.getUsername());
    
    }

结果:

aaaa
bbbb