美文网首页
day02-注解&JavaBean&内省机制

day02-注解&JavaBean&内省机制

作者: 建国同学 | 来源:发表于2020-03-20 20:33 被阅读0次

----------------------写代码过程中的一些新的体会.
1.如果没有get/set. 就算你有字段,也不是属性.
2.字段是boolean的,读方法不是get开头,是is开头.
3.final修饰类不能有子类,修饰方法可以继承,不可覆盖
4.查api子类找不到找他爹

------------------------用自己的话总结一下当天的重点.

一、javabean

三大成员: 事件、方法、 属性(最重要的一个概念).

1.javabean规范

  • 使用public修饰.
  • 字段私有化.
  • 提供get/set方法.
  • 公共的无参数的构造器.(使用反射,使用字节码对象.newInstance去创建对象.)

2.属性

属性不是字段,属性是通过get/set方法推导出来的
推导:如getName()方法
get 去掉 N变小写 ----> name 属性 那这样name就是属性

注意:
    不一定非得是通过工具自动生成的规范的写法
    并不存在的字段,但也是规范的get/set方法也能通过推导出属性。
    规范的IsMan方法也能推导出Man属性   

二、内省的基本操作

什么是内省

  • 优雅操作bean的一种机制(底层使用反射实现)
  • Introspector:内省.操作内省的入口类.

内省的作用

  • 获取到属性名和属性类型等相关状态信息.
  • 获取属性对应的读写方法操作属性的值等操作方式.
    (一句话>>>内省机制的主要作用:用于操作javabean中的属性)

操作步骤

  • 获取JavaBean相关的信息对象:BeanInfo
    //获取字节码对象对应的JavaBean信息
    getBeanInfo(Class<?> beanClass) :
    //获取beanClass到stopClass但不包括stopClass类的类的信息
    getBeanInfo(Class<?> beanClass, Class<?> stopClass)

  • 该BeanInfo中就会封装有当前Bean的成员(字段/属性/事件),这是一个数组对象

//获取属性描述器  Person类中  有属性  有方法
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
  • 获取到对应的属性,对其操作
    获取属性名称:getName());
    获得属性值的get方法:getReadMethod());
    获得属性值的set方法:getWriteMethod());

  • 例子:

@Test
    public void testInvokeMethod() throws Exception {
        // 获取BeanInfo对象                                             
        BeanInfo beanInfo = Introspector.getBeanInfo(Person.class,Object.class);
        Object object = Person.class.newInstance();
        System.out.println(object);//Person [name=null, age=0, isMan=false]
        // 获取属性描述器  Person类中  有属性  有方法
        PropertyDescriptor[]  propertydescriptors = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor propertyDescriptor : propertydescriptors) {
            // PropertyDescriptor  这个类包装了一个属性的信息
            if (propertyDescriptor.getName().equals("name")) {
                // 获取属性的set方法
                Method writeMethod = propertyDescriptor.getWriteMethod();
                // 执行该方法 
                writeMethod.invoke(object, "小马哥");
            }else if(propertyDescriptor.getName().equals("age")){
                // 获取属性的set方法
                Method writeMethod = propertyDescriptor.getWriteMethod();
                // 执行该方法 
                writeMethod.invoke(object, 12);
            }
        }
        System.out.println(object);Person [name=小马哥, age=12, isMan=false]
    }

javaBean 与 Map 互转

  • javaBean 转 map:
    public static Map<String ,Object> beanToMap(Object obj)
  • map 转 javaBean:
    public static Object mapToBean(Map<String, Object> map, Class clz) ;
    //javaBean 转 map
    public static Map<String, Object> beanToMap(Object obj) throws Exception {
        // 创建一个空的map 返回
        Map<String, Object> map = new HashMap<String, Object>();
        // 获取JavaBean中的属性名和属性值
        // 1.获取BeanInfo对象
        BeanInfo beaninfo = Introspector.getBeanInfo(obj.getClass(), Object.class);
        // 2.从BeanInfo中获取到属性描述器
        PropertyDescriptor[] descriptor = beaninfo.getPropertyDescriptors();
        // 3.遍历数组,获取到属性的名称和属性的值
        for (PropertyDescriptor propertyDescriptor : descriptor) {
            // 获取属性的名称
            String name = propertyDescriptor.getName();
            // 获取属性的methode的方法对象
            Method readMethod = propertyDescriptor.getReadMethod();
            // 获取属性的值
            Object value = readMethod.invoke(obj);
            // 把获取的属性名和属性值 存入map
            map.put(name, value);
        }
        return map;

    }
    //map 转 javaBean
    public static Object mapToBean(Map<String, Object> map, Class clz) throws Exception {
        // 根据反射创建对象
        Object instance = clz.newInstance();
        // 先通过内省获取到属性的名称key,然后从map中获取到value
        // 获取JavaBean中的属性名和属性的值
        // 1.获取BeanInfo对象
        BeanInfo beanInfo = Introspector.getBeanInfo(clz, Object.class);
        // 2.从BeanInfo中获取到属性描述器
        PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();
        // 3.遍历数组,获取到属性的名称和属性的值
        for (PropertyDescriptor propertyDescriptor : descriptors) {
            // 获取属性的名称
            String name = propertyDescriptor.getName();
            // 这个name和map中的key是对应的
            Object value = map.get(name);
            // 把获取到的数据存入对象中
            Method writeMethod = propertyDescriptor.getWriteMethod();
            // 执行方法把map中的value存入到bean中相当于真实对象。setXxx (value)
            writeMethod.invoke(instance, value);
        }
        return instance;
    }

三、注解

什么是注解

注解贴在程序元素上,想要拥有某一些功能,.必须有三个角色去参与.

  • 注解本身
  • 被贴的程序元素
  • 三方程序,使用反射给注解赋予功能.(在注解的背后,一定有一段代码给注解赋予功能)

注解接口:Annotation

@Override                      限定覆写父类方法
@Deprecated                 标记已过时,不推荐使用.在JDK1.5之前,使用文档注释来标记过时
@SuppressWarings       抑制编译器发出的警告,@SuppressWarings(value="all")
@SafeVarargs                抑制堆污染警告(Java7开始出现的)          
@Functionallnterface     标记该接口是一个函数接口(Java8开始出现的)

元注解

元注解:在定义注解的时候用来贴在注解上的注解,用来限定注解的用法

@Target: 表示注解可以贴在哪些位置(类,方法上,构造器上等等).位置的常量封装在ElementType枚举类中:
    ElementType.ANNOTATION_TYPE只能修饰Annotation
    ElementType.CONSTRUCTOR只能修饰构造方法
    ElementType.FIELD只能修饰字段(属性),包括枚举常量
    ElementType.LOCAL_VARIABLE只能修饰局部变量
    ElementType.METHOD只能修饰方法
    ElementType.PACKAGE只能修饰包(极少使用)
    ElementType.PARAMETER只能修饰参数
    ElementType.TYPE只能修饰类,接口,枚举

@Retention:  表示注解可以保存在哪一个时期. 表示时期的值,封装在RetentionPolicy枚举类中:
        RetentionPolicy.SOURCE-------------源码时期:编译之后不存在了  >>辅助编译
        RetentionPolicy.CLASS------------字节码时期:运行时期不存在了
        RetentionPolicy.RUNTIME----------运行时期:-直存在  >>程序运行过程中都存在:白定义的注解,都要使用RUNTIME时期

相关文章

  • day02-注解&JavaBean&内省机制

    ----------------------写代码过程中的一些新的体会.1.如果没有get/set. 就算你有字段...

  • 第2讲.注解/JavaBean/内省机制

    注解/JavaBean/内省机制 加载配置文件 什么是硬编码? 在Java开发中,我们很多地方都需要使用到配置文件...

  • 内省机制

    内省机制(操作javaBean的信息) ----是不是联想到了反射机制了哈,这两者有什么区别呢? 1、内省机制和反...

  • Javassist之内省与定制(一)

    CtClass提供了内省的方法。Javassist的内省机制兼容Java的反射API。CtClass提供了getN...

  • javaSE内省机制

    什么是javaBean: JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具...

  • 21天财富能量—2

    【Day02-笔记】富人如何赚钱 Day02-富人如何赚钱:如何突破现有的财富维度? 数据: 2016年法国经济学...

  • 2018-04-12

    注解机制及其原理 什么是注解 注解也叫元数据,例如我们常见的@Override和@Deprecated,注解...

  • 注解与反射

    注解(Annotation) 什么是注解 注解又叫 Java 标注,是 JDK5.0 引入的一种注释机制。注解是元...

  • Java-内省机制

    JavaBean:相当于一种规范,通常只包含一些信息字段和存储方法,该类只有一些属性和针对该属性的get、set方...

  • Java 高级-------内省机制

    先简单地了解一下JavaBean的概念: Bean可以理解为组件的意思,JavaBean 就是Java组件,在广泛...

网友评论

      本文标题:day02-注解&JavaBean&内省机制

      本文链接:https://www.haomeiwen.com/subject/fcesyhtx.html