Spring 都在用的技术,你确定不过来看看?3️⃣
五、内省
5.1、JavaBean
JavaBean 是 Java 中最重要的一个可重用的组件(减少代码重复,可重用,封装业务逻辑,封装数据)。
5.1.1、JavaBean 的规范要求
使用 public 修饰。
字段私有化。
提供 get/set 方法。
公共的无参数的构造器(使用反射,使用字节码对象.newInstance 去创建对象)。
5.1.2、三大成员
事件
方法
属性
5.1.3、什么是属性
JavaBean 可以封装数据,就是将数据保存到一个 bean 对象的属性中的。
属性不是字段,属性是通过 get/set 方法推导出来的。
**规范的 get 方法/获取方法/读方法:**public 修饰、无参数、有返回、get 开头。
**规范的 set 方法/设置方法/写方法:**public 修饰、有参数、无返回、set 开头。
注意:
只要是标准的 get/set 方法,就存在属性,不一定非得是通过工具自动生成的规范的写法。
字段是 boolean 的,读方法不是 get 开头,而是 is 开头。
5.2、内省的概述
JavaBean 是一个非常常用的组件,无外乎就是操作里面的属性。而之前我们要获取 JavaBean 中的方法,如果使用反射非常麻烦,于是 SUN 公司专门提供了一套操作 JavaBean 属性的 API: 内省(Introspector
)。
5.3、内省的作用
获取到属性名和属性类型等相关状态信息。
获取属性对应的读写方法操作属性的值等操作方式。
5.4、内省常用的 API
通过字节码对象,获取到 JavaBean 的描述对象,返回 JavaBean 的描述对象
public static BeanInfo getBeanInfo(Class beanClass, Class stopClass);
通过 JavaBean 描述对象获取属性描述器
PropertyDescriptor[] getPropertyDescriptors();
通过属性描述器,获取到属性名、属性类型、读写(getter/setter)方法
获取属性名:
public String getName();
获取属性类型:
public Class<?> getPropertyType();
获取读方法(getter):
public Method getReadMethod();
获取写方法(setter):
public Method getWriteMethod();
通过字节码对象来获取 BeanInfo 对象的时候,默认会内省当前字节码对象以及其所有的父类的信息。比如:getBeanInfo(A.class)
,其实它也会内省 A 的父类,如 Object 的信息。一般来说,我们不关心父类的属性相关信息,此时可以调用 getBeanInfo 的重载方法:getBeanInfo(beanClass,stopClass)
。
示范:BeanInfo beanInfo = Introspector.getBeanInfo(Person.class,Object.class);
5.5、JavaBean 和 Map 之间的转化
map 和 JavaBean 的结构很类似,我们可以将 map 和 JavaBean 相互转换.将 key 和属性名一 一对应起来
5.5.1、JavaBean 转 map
5.5.2、map 转 JavaBean
六、注解
6.1、注解介绍
我们可以使用注解来修饰类中的成员信息,注解其实就是 Annotation。
6.2、定义格式
定义格式:@interface 注解名
使用格式:@注解名(属性名=属性值, 属性名=属性值)
注解贴在程序元素上,想要拥有某一些功能,必须有三个角色去参与:
注解本身
被贴的程序元素
第三方程序,使用反射给注解赋予功能(在注解的背后,一定有一段代码给注解赋予功能)。
6.3、内置注解
@Override
限定覆写父类方法@Deprecated
标记已过时,不推荐使用.在 JDK5 之前,使用文档注释来标记过时@SuppressWarings
抑制编译器发出的警告@Functionallnterface
标记该接口是一个函数接口(JDK1.8 开始出现的)
6.4、元注解
注解:用来贴在类/方法/变量等之上的一个标记,第三方程序可以通过这个标记赋予一定功能。
元注解:在定义注解的时候用来贴在注解上的注解,用来限定注解的用法。他囊括了三个注解
6.4.1、@Target
表示注解可以贴在哪些位置(类,方法上,构造器上等等).位置的常量封装在ElementType
枚举类中。
ElementType.ANNOTATION_TYPE
只能修饰类。ElementType.CONSTRUCTOR
只能修饰构造方法。ElementType.FIELD
只能修饰字段(属性),包括枚举常量。ElementType.LOCAL_VARIABLE
只能修饰局部变量。ElementType.METHOD
只能修饰方法。ElementType.PACKAGE
只能修饰包。ElementType.PARAMETER
只能修饰参数。ElementType.TYPE
只能修饰类,接口,枚举。
6.4.2、@Retention
表示注解可以保存在哪一个时期,表示时期的值,封装在 RetentionPolicy 枚举类中。
6.4.3、@Documented
使用@Documented
标注的标签会保存到 API 文档中。
6.4.4、@Inherited
@Inherited
标注的标签可以被子类所继承。
标记已过时,不推荐使用.在 JDK5 之前,使用文档注释来标记过时
@SuppressWarings
抑制编译器发出的警告@Functionallnterface
标记该接口是一个函数接口(JDK1.8 开始出现的)
评论