zoukankan      html  css  js  c++  java
  • java--内省

    • 内省:
    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
  • 相关阅读:
    Android中隐藏顶部状态栏的那些坑——Android开发之路3
    仿喜马拉雅实现ListView添加头布局和脚布局
    Android中点击隐藏软键盘最佳方法——Android开发之路4
    Git从码云Clone代码到本地
    Android中webView和网页的交互
    Android工程师常见面试题集
    协调者布局:CoordinatorLayout
    如何保证Service在后台不被kill
    Android的四大组件之Activity
    Intent的七大组件——Android开发之路5
  • 原文地址:https://www.cnblogs.com/wangsr-suc/p/8920879.html
Copyright © 2011-2022 走看看