黑马程序员------------------内省,JavaBean,BeanUtils工具包

-------  android培训 java培训 、期待与您交流! ----------

一:基础内容

1.必须掌握的英语单词:

bean(豆类;豆子 );

JavaBean(对象,共享,JAVA,模型);

info(信息);

Descriptor(描述符号)

Introspector(内省);

PropertyDescriptor(属性描述器 )

property(性质)

Properties(性能,道具,内容,属性,特性)

2.必须理解的类与接口:

java.beansBeanInfo接口:提供有关其 bean 的方法、属性、事件等显式信息

 

java.beans.Introspector类:extends Object为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法。 

 

java.beans.PropertyDescriptor类:描述 Java Bean 通过一对存储器方法导出的一个属性。  

3.必须了解的异常:

java.lang.IllegalAccessException当应用程序试图反射性地创建一个实例(而不是数组)、设置或获取一个字段,或者调用一个方法,但当前正在执行的方法无法访问指定类、字段、方法或构造方法的定义时,抛出 IllegalAccessException

java.lang.reflect.InvocationTargetException是一种包装由调用方法或构造方法所抛出异常的经过检查的异常。 

javax.management.IntrospectionException在 MBean 的 introspection 期间出现的异常。

 

二:什么是内省? 

内省(introSpector)是 Java 语言对 Bean 类属性、事件的一种处理方法(也就是说给定一个javabean对象,我们就可以得到/调用它的所有的get/set方法)。 

 例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。

 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则,这些 API 存放于包 java.beans 中。

我们又通常把javabean的实例对象称之为值对象(Value Object),因为这些bean中通常只有一些信息字段和存储方法,没有功能性方法。

 

总结:内省是 Java 语言对 Bean 类属性、事件的一种处理方法,而这些方法存放在包 java.beans 中 

三:什么是Javabean? 

   1. JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他Java 类可以通过自身机制发现和操作这些JavaBean 的属性。

     JavaBean可分为两种:一种是有用户界面(UIUser Interface)的JavaBean;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBeanJSP通常访问的是后一种JavaBean

 

总结:现在学习的是没有用户界面,主要负责处理事务的JavaBean,而这个javabean是一种特殊的java类,它的方法符合特殊的规则。只要一个类中含有getisset打头的方法,就可以将其当做JavaBean使用。

 

2.Javabean的一般格式:

int getAge();

void  setAge(int age);

 

3.javabean的属性是根据其中的settergetter方法来确定的 .,其实根据getset的打头的方法后名缀得出来的:

后缀名书写规则:

如果第二个字母是小写的,则打第一个字母变成小写

例:getAge --> age ; setAge ---> age;

如果后缀全是小写则全小写:

例:gettime---> time; settime --> time;

如果后缀全是大写则全大写:

例:getCPU ---> CPU ; setCPU ---> CPU;

 

 

4.JavaBean的优点:

javaEE开发中,经常要使用到JavaBean,很多环境就要按JavaBean方式进行操作。

Jdk中提供了对JavaBean进行操作的API,通过这套API能更方便的获取对象getxsetx的私有。

 

5.Javabean的用途之一在两个模块之间传递多个信息:

则可以将这些信息封装到JavaBean中,这种JavaBean的实例对象,通称值为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,这个方法就用javabean的属性中的settergetter方法来确定的。

 6.例:

获取ReflectPoint 中的x属性。

public class ReflectPoint {
private int x;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
}

方式一:简单操作JavaBean。就是通过Eclipse自带的方法鼠标右键--->Refactor--->Extract method自动重构抽取方法。

import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.apache.commons.beanutils.BeanUtils;
//这个类读取JavaBean对象的x属性。
public class IntroSpectorTest{
public static void main(String[] args)throws Exception {
ReflectPoint pt1  = new  ReflectPoint(3, 5);
String propertyName = "x";
/*用普通方法获取X的值步骤:
1.首先把小写"x"变成大写"X"。如果"X"后面还有字母,则还要看第二个字母是大写还是小写。
然后用JavaBean书写规则
2.在"X"前面加入"get"变成"getX"这样就得到方法名。
3.在通过反射的方法,MethodGetX
*/
//通过内省的方式获取X的值:
//用一个属性描述符的类
PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());
//得到方法
Object retVal = getproperty(pt1, pd);
System.out.println(retVal);
//设置方法。
Object value = 7;
setproperty(pt1, pd, value);
}
//通过Eclipse--->Refactor--->Extract method自动重构抽取方法。
private static void setproperty(ReflectPoint pt1, PropertyDescriptor pd,
Object value) throws IllegalAccessException,
InvocationTargetException {
Method methodSetX = pd.getWriteMethod();
methodSetX.invoke(pt1,value);
System.out.println(pt1.getX());
}
//通过Eclipse--->Refactor--->Extract method自动重构抽取方法。
private static Object getproperty(Object pt1, PropertyDescriptor pd)
throws IllegalAccessException, InvocationTargetException {
Method methodGetX = pd.getReadMethod();
Object retVal = methodGetX.invoke(pt1);
return retVal;
}
}

方式二:采用遍历BeanInfo的所有属性方式来查找和设置某个ReflectPoint对象的X属性。在程序中把一个类当做javaBean来看,就是调用IntroSpector.getBeanInfo方法,得到的BeanInfo对象封装了把这个类当做javaBean看的结果信息。

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class IntroSpectorTest2 {
public static void main(String[] args)throws Exception {
ReflectPoint pt1  = new  ReflectPoint(3, 5);
String propertyName = "x";
PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());
//得到方法
Object retVal = getproperty(pt1, propertyName);
System.out.println(retVal);
}
private static Object getproperty(Object pt1, String propertyName)
throws IllegalAccessException, InvocationTargetException,
IntrospectionException {
//创建对象关联  
BeanInfo  beanInfo = Introspector.getBeanInfo(pt1.getClass());
//得到所有的属性描述
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
Object retVal = null;
//对这个属性进行迭代
 for(PropertyDescriptor pd1 : pds){
 //如果属性跟参数的属性相等,就获取它的getX方法  
if(pd1.getName().equals(propertyName)){
Method methodGetX = pd1.getReadMethod();//获取getX方法 
retVal = methodGetX.invoke(pt1);
break;
}
}
return retVal;
}
}


四:BeanUtil工具包

1. 由于对JavaBean属性的setget操作的需求非常广泛和使用的频率很高,所以引入了专门针对JavaBean进行操作的工具类。BeanUtils工具包是由阿帕奇提供的。

2.如何使用beanUtils工具包:

1)导入BeanUtilSjar工具包.(因为是工具类中方法是都是静态的)

2)在工程中导入工具jar

方式一:右键项目--选择Properties---Java Build Path--选择Liberiers标签。AddExternal Jars--选择要导入的jar包。这样做有个问题就是如果jar路径发生变化。项目就不能使用到这个jar包。

方式二:把下载好的commons-beanutils-1.9.2解压文件中的jarEclipse中点击右键根目录,创建一个目录(点击new--folder)名字加lib,再把jarctrl+v考入lib文件夹内,再在lib文件内的jar包中点右键--buildPath-->Add to BuildPath.这样就可以使用了。这样做的好处:项目移动,jar随项目移动。

3)除了要导入BeanUtilSjar工具包外还要导入阿帕奇的日志包commons-logging-1.2

3.使用BeanUtils的好处:

1BeanUtilsgetset的值当做字符串来操作的,但实际上JavaBean里面的类型不是字符串,这里就涉及到转换,而这个转换NeanUtils能自动完成,这就是BeanUtils第一个好处。

2)支持属性的级联操作。

例://BeanUtils的好处:

BeanUtils.setProperty(pt1, "brithday.time""111");

System.out.println(BeanUtils.getProperty(pt1, "brithday.time"));

举例:

import java.util.Date;
public class ReflectPoint {
private int x;
private Date brithday = new Date();
public Date getBrithday() {
return brithday;
}
public void setBrithday(Date brithday) {
this.brithday = brithday;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
}

BeanUtils提取ReflectPoint 中的Xbrithday属性。

import java.beans.PropertyDescriptor;
import org.apache.commons.beanutils.BeanUtils;
//这个类读取JavaBean对象的x属性。
public class IntroSpectorTest {
/**
 * @param args
 */
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
ReflectPoint pt1  = new  ReflectPoint(3, 5);
String propertyName = "x";
 
//用beanUtils工具包
System.out.println(BeanUtils.getProperty(pt1, "x"));
BeanUtils.setProperty(pt1, "x", 9);
System.out.println(pt1.getX());
//BeanUtils的好处:
BeanUtils.setProperty(pt1, "brithday.time", "111");
System.out.println(BeanUtils.getProperty(pt1, "brithday.time"));
}

四:PropertyUtils工具包.

1.PropertyUtils与BeanUtils

1)BeanUtils工具包中还有一个工具类PropertyUtils,用法跟BeanUtils一样。

2)区别:

1)BeanUtils会对JavaBean的属性的类型进行转换,如属性本身是integer,会转换为String

2)PropertyUtils以属性本身的类型进行操作。

举例:

//用BeanUtils工具包的工具类BeanUtils方法
BeanUtils.setProperty(hct, propertyName, "9");//set,9是String
System.out.println(BeanUtils.getProperty(hct, propertyName));//get
System.out.println(BeanUtils.getProperty(hct, propertyName).getClass().getName());//java.lang.String
//BeanUtils工具包中的PropertyUtils的操作
PropertyUtils.setProperty(hct, propertyName, 9);//9是Integer
System.out.println(PropertyUtils.getProperty(hct, propertyName));
System.out.println(PropertyUtils.getProperty(hct, propertyName).getClass().getName());//java.lang.Integer


 


你可能感兴趣的:(黑马程序员------------------内省,JavaBean,BeanUtils工具包)