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

    大纲:

    1. JavaBean 规范
    2. 内省

    一、JavaBean 规范

    JavaBean —般需遵循以下规范。

    1. 实现 java.io.Serializable 接口。
    2.  javaBean属性是具有getter/setter方法的private成员变量。也可以只提供getter方法,这样的属性叫只读属性;也可以只提供setter方法,这样的属性叫只写属性。
    3. JavaBean 必须有一个空的构造函数
    4. JavaBean 必须有一个public构造函数

    二、内省

    • 首先内省的本质也是利用反射
    • 通过内省可以快速拿到javaBean变量的getter与setter,从而快速操作bean对象。

    测试用javaBean

    public class Person {
        private String name ;
        private int age ;
        public void say(){
        }
    
        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;
        }
    }

    1.可以通过BeanInfo对象拿到JavaBean类中所有属性和方法的描述器

        public static void main(String[] args) throws Exception {
            //获取BeanInfo对象,主要用于获取javaBean的属性描述器
            BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);
            //方法描述器
            MethodDescriptor[] methodDescriptors = beanInfo.getMethodDescriptors();
            //属性描述器
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            //测试对象
            Person person = new Person();
    
            for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
                //属性名
                System.out.println("Person的属性:"+propertyDescriptor.getName());
                if("name".equals(propertyDescriptor.getName())){
                    //属性读方法
                    Method readMethod = propertyDescriptor.getReadMethod();
                    //属性的写方法
                    Method writeMethod = propertyDescriptor.getWriteMethod();
                    writeMethod.invoke(person,"xiaoming");
                    System.out.println("person的name:"+readMethod.invoke(person));
                    Class<?> propertyType = propertyDescriptor.getPropertyType();
                    System.out.println("属性的类型:"+propertyType.getName());
                }
            }
        }

    2.直接获取某个属性的描述器

        public static void main(String[] args) throws Exception {
            Person p = new Person();
            //直接通过名称获取属性描述器
            //获取name属性的描述器,方便我们直接操作p对象的name属性。
            PropertyDescriptor descriptor = new PropertyDescriptor("name", Person.class);
            Method writeMethod = descriptor.getWriteMethod();
            writeMethod.invoke(p,"nananan");
            System.out.println("person对象name:"+descriptor.getReadMethod().invoke(p));
        }
  • 相关阅读:
    IDEA中Git的更新、提交、还原方法
    Java链接Redis时出现 “ERR Client sent AUTH, but no password is set” 异常的原因及解决办法
    Vim常用匹配、查找、替换命令总结
    eclipse设置jvm
    Cash Loan----:利用脚本自动化部署系统,解放我们的双手
    阿里云OSS工具类
    GET请求中URL的最大长度限制总结
    SpringMvc中两个Controller类之间传递参数的方法
    7个小技巧,解决eclipse卡顿问题
    eclipse启动优化,终于不那么卡了!
  • 原文地址:https://www.cnblogs.com/liuboyuan/p/11120481.html
Copyright © 2011-2022 走看看