Java反射、内省与Beanutils工具
5.1 JavaBean
JavaBean是Java开发中的一个可以重复使用的的软件组件,本质就是一个Java类
一个标准的JavaBean组件需要遵循一定的编码规范
1.它必须有一个公共的、无参的公共构造方法,这个方法可以是编译器自动产生的默认构造方法
2.它提供公共的setter和getter方法让外部程序设置和获取JavaBean的属性
5.2反射
反射的根源的class类,如果想要完成反射操作,就必须认识class类
一般情况下,需要先有一个类的完整路径引入之后,才可以按照固定的格式产生实例化对象,但是,在Java中允许通过一个实例化对象,找到一个类的完整信息。这就是class类的功能
下面是class类的部分常用方法
方法声明 | 功能描述 |
static Class<?> forName(String className) className为全限定类名(类的完整路径) | 返回与带有字符串名的类或接口相关联的class对象 |
Constructor<?> [ ] getConstructors() | 返回一个包含某些Constructor对象的数组,这个对象反映此Java对象所表示类的所有公共构造方法 |
Field[ ] getFields() | 返回一个包含某些Field对象的数组,这些对象反映此class对象所表示的类或者接口的所有可访问公共字段包括继承的公共字段 |
Field[ ] getDeclaredField(String name) | 返回一个包含某些field对象的数组,这些对象反映了此class对象所表示的类或接口所声名的所有字段(公共,保护,默认,私有),但是不包括继承字段 |
Method getMethod(String name,Class<?>..parameterType) | 返回一个Method对象,反映此class对象所表示的类或者接口的指定公共成员方法 |
Class<?>[ ] getInterfaces | 返回该类实现的接口的一个数组,确定此对象所表示的类或接口所实现的类 |
String getName() | 以String的形式返还此class对象所表示的实体(类,接口,数组类,基本类型或void)名称 |
T newInstance() | 创建此class对象所表示类的一个新实例 |
boolean isArray() | 判定此class对象是否表示一个数组类 |
通过反射创建对象:
1. 通过无参构造方法创建对象
首先要保证被实例化的对象中一定要有无参构造方法;
接下来通过forName()方法获取class对象,再通过newInstance()方法创建对象
2. 通过有参构造方法创建对象
首先通过forName()方法获取class对象
通过class对象的getConstructors方法获取本类中全部的构造方法
向获取的构造方法中传递一个对象数组进去,包含构造方法所需的各个参数
通过Constructor类实例化对象
注意:Constructor类表示的是构造方法,该类有很多常用的方法
方法声明 | 功能描述 |
int getModifiers() | 获取构造方法的修饰符 |
String getName() | 获得构造方法的名称 |
Class<?>[ ]getParameterTypes() | 获取构造方法中参数的类型 |
T newInstance(Object..initargs) | 向构造方法中传递参数,实例化对象 |
3. 通过反射访问对象的属性
通过反射访问对象的属性是通过Field类实现的,它提供的set()方法和ger()方法分别用于设置和读取属性,需要注意的是,如果,对象的某个属性为私有(private)的,则需要在修改或读取属性之前,通过serAccessible(boolean str)方法将属性设为外界可以访问的
4. 通过反射调用对象的方法
获得某个类的class对象之后,就可以用getMethod()方法或者getMetods()方法获取指定方法或者全部方法,
Method对象中有一个invoke()方法
public Object invoke(Object obj,Object..args)
参数obj是该方法最主要的参数(class类的实例化对象),它后面的参数args是一个相对于数组的可变参数,用来接收实参
5.3内省
Jdk中提供了一套API用来访问对象的某个属性的setter()和getter()方法,内省是Java语言对JavaBean类属性,事件和方法的一种标准处理方式
1.内省访问Javabean 有俩种方法
1. 通过java.beans包下的Introspector()类获得JavaBean对象的BeanInfo信息,再通过BeanInfo来获取属性的描述器(PropertyDescriptor),然后,通过这个属性描述器就可以获得某个属性的setter()方法和getter()方法
2. 直接通过java.beans包下的PropertyDescriptor()类来操作bean对象
JavaBean
通过方法一访问JavaBean的属性
2.修改JavaBean的属性
3.读取JavaBean的属性
5.4 BeanUtils工具
BeanUtils工具是apache提供的用于操作JavaBean的API
下载官网:https://commons.apache.org/proper/commons-beanutils/
注意:BeanUtils工具还需要一个logging包来配合使用
BeanUtils工具中最核心的类就是org.apache.commons.beanutils
方法声明 | 功能描述 |
static String getMappedProperty(Object bean,String name) | 返回指定bean中指定索引属性的值,返回值为String类型 |
static String getMappedProperty(Object bean,String name,String key) | 返回指定bean中指定索引属性的值,返回值为String类型 |
static String getProperty(Object bean,String name) | 返回指定bean中指定属性的值,返回值类型为String类型 |
static void populate(Object bean,Map< String,?extends Object> properties) | 根据指定的名称/值对为相应的JavaBean属性值 |
static void setProperty(Object bean,String name,Object value) | 设置指定bean中指定的属性值,传入的类型要求能转换成相应属性类型 |