------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
JavaBean
是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id。 字段对外提供了get或set方法就可以称之为属性,一个get方法就为一个属性,一个类中还有一个从object中获得的getclass方法既一个calss属性
总之,一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。
JavaBean的分类
a)狭义的JavaBean
.私有的字段(Field)
.对私有字段提供存取方法(读写方法)
b)广义的JavaBean
.私有的字段(Field)
.对私有字段提供存取方法(读写方法)
.数量任意的业务方法
1、内省 introspector 对javabean进行操作
javabean 方法的名字以set 或get打头
Javabean的属性是根据方法名来判断属性的,
getAge---->对应的属性名 age
应用
主要在两个模块之间传递信息
属性描述 propertydescriptor
内省获得值
propertyDescriptor pd = new propertyDescriptor(propertName, pt1.getClass)
get方法
Method methodGet= pd.getReadMethod();
object retval = methodGet.invoke(pt1);
set方法
Method methodSet= pd.getWriteMethod();
methodSet .invoke(pt1,7)
2、配置文件的加载:
配置文件的加载一般都是使用类加载器
方法
类名.classs.getClassLoader().getResouseStresm("相对于类的路径")
类名.classs.getResouseStresm("/相对于classpath的路径")
类名.classs.getResouseStresm("相对于类的路径")
3、针对javabean的工具包 BeanUtils
BeanUtils.getproperty(pt1,"x")
BeanUtils.setProperty(pt1,"x","9")
支持属性级联
把一个对象身上的属性拷贝到另一个属性身上
propertyUtils.setproperty(pt1,"x",9)
4、得到javabean的所有属性(早期代码)
BeanInfo beanInfo= Introspector.getBeanInfo(pt1.getClass())
properstyDescripror[] pds= beanInfo.getPropertyDescriptors();
object value=null;
for(propertyeDescriptor pd:pds){
if(pd.getName.equals(properName)){
Method methodGetx= pd.getReadMethod();
retVal=methodGetx.invoke(pt1)
break;
}
}
Instropector 内省->站在反射的角度,主要用于对JavaBean进行操作
操作javaBean就是对javaBean进行get和set操作。两种方法如下:
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class BeanTest {
public static void main(String[] args) throws Exception{
ReflectPiont piont = new ReflectPiont("hehe","haha");
String propertyName = "name";
//把ReflectPiont 当做JavaBean看,并且得到其所有JavaBean信息
BeanInfo beanInfo = Introspector.getBeanInfo(piont.getClass());
//PropertyDescriptor是JavaBean的属性描述符,用于描述JavaBean的属性
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();//得到JavaBean的所有属性
for(PropertyDescriptor pd:pds)
{
//System.out.println(pd.getName());
if(pd.getName().equals(propertyName))
{
//得到该属性的get方法
Method getName = pd.getReadMethod();
//调用该方法并指定在哪个对象上调用
System.out.println(getName.invoke(piont));
}
}
//新建一个PropertyDescriptor,并指定把哪个类看做JavaBean和属性的名字
PropertyDescriptor pd = new PropertyDescriptor(propertyName, piont.getClass());
Method getName = pd.getReadMethod();
System.out.println(getName.invoke(piont));
}
}
BeanUtils框架/工具(APACHE开源组织开发)
1)BeanUtils框架能够完成内省的一切功能,而且优化
2)BeanUtils框架能够对String<->基本类型自动转化
3)BeanUtils框架自定义转换器:
ConvertUtils.register( 转换规则,目标对象的Class)
4)向BeanUtils框架注册自定义转换器必须放在bu.setProperty()代码之前
5)使用BeanUtils内置String->Date的转换器:
ConvertUtils.register(newDateLocaleConverter(),java.util.Date.class);
应用代码如下:
/*使用BeanUtils包中的方法设置JavaBean属性
第一个参数:被看做javaBean的对象 第二个参数:属性的名称
第三个参数:想要设置的值,基本类型都可以以String形式传入,BeanUtils会将String自动转换
为八种基本类型
*/
BeanUtils.setProperty(piont, propertyName, "zyg");
//根据属性名得到属性值
System.out.println(BeanUtils.getProperty(piont, propertyName));
/*
* 事实上,BeanUtils的set和get方法都是以字符串的形式对属性进行操作的
* 因为其内部数据类型进行了自动的转换,以适用javaWeb的应用
*/
/*BeanUtils.describe(bean);此方法将JavaBean转换成一个Map集合
即<属性,值>这样的键值对*/
//向BeanUtils注册自定义的转换器(String->java.util.Date.class)
ConvertUtils.register(new Converter(){
@Override
public Object convert(Class type, Object value) {
/*第一个参数:所要转换的目标类型 java.util.Date.class
* 第二个参数:传入的参数类型 java.lang.String
*/
String strBirthday = (String)value;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
return sdf.parse(strBirthday);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
}, java.util.Date.class);
BeanUtils.setProperty(piont, "birthday", "2010-3-11");
System.out.println(BeanUtils.getProperty(piont, "birthday"));