Java反射、内省与Beanutils工具

原创 2018年04月15日 23:54:34
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中指定的属性值,传入的类型要求能转换成相应属性类型

例如


Java的反射(Reflection)、内省(Retrospector)和beanUtils工具

反射(Reflection):加载类,并解剖出类的各个组成部分(反射就是解剖的意思) 加载类,获得类的字节码(三种方式): Class clazz1 = Class.forName("cn....
  • ClementAD
  • ClementAD
  • 2016-02-04 15:59:49
  • 2774

使用Apache的BeanUtils进行JavaBean的反射操作

对JavaBean的操作,Java提供了一套自己的方法,但是用起来感觉不咋的,但是Apache自己出版了一套BeanUtilsAPI方法进行Bean操作,很牛逼,很好用,下面放上几个小例子,用来入门吧...
  • a352193394
  • a352193394
  • 2011-11-13 22:27:29
  • 5535

Java的反射和内省的区别

反射 反射就是运行时获取一个类的所有信息,可以获取到.class的任何定义的信息(包括成员 变量,成员方法,构造器等) 可以操纵类的字段、方法、构造器等部分。 内省 内省基于反射实现,主要...
  • zhanjixun
  • zhanjixun
  • 2017-03-30 00:00:13
  • 2059

Java基础增强3-反射,内省,beanutils,泛型

1、反射: 反射就是把Java类中的各种成分映射成一个个的java对象。例如,一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。主要应用...
  • danny1991
  • danny1991
  • 2015-10-23 09:42:51
  • 382

Java反射与内省的区别

Java反射和内省的关系
  • u011446250
  • u011446250
  • 2016-06-20 19:16:29
  • 744

反射和内省比较

反射常见应用场景 1. 通过类名得出类; 2. 通过方法名得出方法; 3. 调用对象的方法(Method类出自java.lang.reflect.Method); 反射常见应用场景 1. 根...
  • xianzhen376
  • xianzhen376
  • 2015-10-12 20:13:03
  • 536

JAVA的内省机制(introspector)与反射机制(reflection)

 相对而言,反射比内省更容易理解一点。用一句比较白的话来概括,反射就是让你可以通过名称来得到对象 ( 类,属性,方法 ) 的技术,这种技术比内省机制使用范围更广泛。例如我们可以通过类名来生成一个类的实...
  • zgmzyr
  • zgmzyr
  • 2010-07-21 17:19:00
  • 4655

Java反射的工具类BeanUtils

-----------内省(introspection)------------- 1. javabean     遵循固定写法的java类     1)必须有无参构造函数 Class.forN...
  • u014175572
  • u014175572
  • 2015-06-26 09:29:52
  • 2682

内省 + 反射(简单应用实现原理)

当我们需要封装从页面传递到后台的请求参数时,简单的方式就是使用一个工具类帮我们封装,省很多力气,还不容易出错。那接下来就简单介绍下这个BeanUtils工具类的实现原理,顺便重温下java内省机制。 ...
  • java__project
  • java__project
  • 2016-12-24 22:55:38
  • 630

java反射和内省

本文学习并总结java反射和内省技术,这2部分知识个人感觉可以算是java的高深内容了,反射是用来做框架的,内省是用来操作javaBean对象的,这2部分知识有相似之处,不可或缺。...
  • chen_yuyunfox
  • chen_yuyunfox
  • 2014-05-31 08:34:23
  • 863
收藏助手
不良信息举报
您举报文章:Java反射、内省与Beanutils工具
举报原因:
原因补充:

(最多只允许输入30个字)