开发框架时,经常需要使用java对象(javaBean)的属性来封装程序的数据,封装javaBean的方法有很多,比如反射,内省,以及使用工具类。下面从反射开始介绍。

1.javaBean介绍:

  1. 简介:

    JavaBean是使用Java语言开发的一个可重用的组件,在开发中可以使用JavaBean减少重复代码,使整个代码的开发更简洁。
  2. 编写要求:

    javaBean本身是一个类,设计该类的时候要遵循一下方法:

    1.如果成员变量的名字是xxx,则相应地有两个用来得到成员变量值和设置变量值的方法,它们分别是getXxx()和setXxx()且是public的:
    public datatype getXxx();
    public void setXxx(datatype data); (2)如果成员变量是boolean型数据,使用is代替get方法;:
    public boolean isXxx();
    (3)需要一个无参数的构造函数。
  3. 一个javaBean的例子:

//javaBean
public class Person {
private int id;
private String name;
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
//无参数构造函数
public Person(){}
//获得Id属性
public int getId() {
return id;
}
//设置
public void setId(int id) {
this.id = id;
}
//get方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//tostring不在要求之中;
@Override
public String toString() { return "id:"+ this.id+" name:"+ this.name;
} }

2.使用反射封装JavaBean:

通过反射更改对象域来封装JavaBean,通过getDeclaredField方法获得对应的域,并调用set方法进行修改。

下面的方法通过配置文件更改JavaBean的属性:

配置文件内容如下:obj.txt
com.rlovep.bean.Person
id=22
name=peace
代码与注释:
public class CofigRef {
public static void main(String[] args) {
try {
//获得更改后的对象;
Person p=(Person)getInstance();
System.out.println(p);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//根据配置文件的内容生产对象的对象并且要把对象的属性值封装到对象中。
public static Object getInstance() throws Exception{
//通过字符流进行输入;
BufferedReader bufferedReader = new BufferedReader(new FileReader("obj.txt"));
String className = bufferedReader.readLine(); //读取配置文件获取到完整的类名。
Class clazz = Class.forName(className);
//通过class对象获取到无参的构造方法
Constructor constructor = clazz.getConstructor(null);
//创建对象
Object o = constructor.newInstance(null);
//读取属性值
String line = null;
while((line = bufferedReader.readLine())!=null){
String[] datas = line.split("=");
//通过属性名获取到对应的Field对象。
Field field = clazz.getDeclaredField(datas[0]);
field.setAccessible(true);
if(field.getType()==int.class){
//更改属性内容;
field.set(o, Integer.parseInt(datas[1]));
}else{
field.set(o, datas[1]);
} }
bufferedReader.close();
return o; }

此去用反射进行更改,直接更改实现域的值;比较麻烦。需要各种判断和操作,不适合用于开发。

3.通过内省封装JavaBean:

内省(Introspector) 是Java 语言对 JavaBean 类属性、事件的一种缺省处理方法。Java JDK中提供了一套 API 用来访问某个属性的 getter/setter 方法,这就是内省。

1. PropertyDescriptor类:

属性描述器类,利用该类可以获得对应属性的get和set方法。

getReadMethod(),获得用于读取属性值的方法;getWriteMethod(),获得用于写入属性值的方法;

演示如下:

       //属性描述器
PropertyDescriptor descriptor = new PropertyDescriptor("id", Person.class);
//获取属性对应的get或者是set方法设置或者获取属性了。
Method m = descriptor.getWriteMethod(); //获取属性的set方法。
//执行该方法设置属性值
m.invoke(p,110);
//获得get方法;
Method readMethod = descriptor.getReadMethod(); //是获取属性的get方法
System.out.println(readMethod.invoke(p, null));
  1. Introspector类:

    通过调用Introspector.getBeanInfo(People.class)方法可以获得BeanInfo对象,改对象封装了people类的所有属性。

    而BeanInfo中有方法 getPropertyDescriptors(),获得属性的描述PropertyDescriptor[],可以通过遍历返回结果可以操作JavaBean。演示如下:
   //Introspector 内省类
BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);
//通过BeanInfo获取所有的属性描述
PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors(); //获取一个类中的所有属性描述器
for(PropertyDescriptor p : descriptors){
//获得所有get方法
System.out.println(p.getReadMethod()); //get方法
}

通过这两个类的比较可以看出,都是需要获得PropertyDescriptor,只是方式不一样:前者通过创建对象直接获得,后者需要遍历,所以使用PropertyDescriptor类更加方便。

内省封装比反射相对来说简单点,但是实质上是反射的一种变体。

4利用BeanUtils封装JavaBean

  1. 介绍:

    每次都使用反射技术完成此类操作过于麻烦,所以Apache开发了一套简单、易用的API来操作Bean的属性–BeanUtils工具包。

    注意:应用的时候还需要一个logging

    BeanUtils下载地址:链接

    logging下载地址:链接
  2. 使用BeanUtils:

    BeanUtils主要解决 的问题: 把对象的属性数据封装 到对象中。

    属性值从配置文件中获取时可能都是String类型, BeanUtils好处是如果属性是基本数据 类型,BeanUtils会自动帮我转换数据类型。如果设置的属性是其他的引用 类型数据,这时候可以注册一个类型转换器。

    1.获得属性的方法:BeanUtils.getProperty(admin,”userName”);

    2.设置属性的方法:BeanUtils.setProperty(admin, “id”, 001);

    3.拷贝属性的方法:BeanUtils.copyProperty(admin, “usetName”, “peace”);与set效果相同。

    4.当属性不能自动转换通过ConvertUtils.register(new Converter())注册转换器;
  3. 演示如下:

    需要引入包:commons-logging.jar 、 commons-beanutils-1.8.0.jar

    Admin中的属性:
private int id;
private String userName;
private String pwd;
private int age;
private Date birth;

BeanUtils使用如下:

public class BeanOpr {
private String name; @Test
/**
*
* @Title: testHello
* @Description: beanutiils拷贝的介绍
* @return:void
* @throws
* @author peace w_peace@163.com
*/
public void testHello(){
Admin admin=new Admin();
try {
//获得属性方法:
System.out.println(BeanUtils.getProperty(admin,"userName"));
//拷贝属性
BeanUtils.copyProperty(admin, "usetName", "peace");
//类似于设置属性
BeanUtils.setProperty(admin, "id", 001);
//对象的拷贝
Admin admin2=new Admin();
BeanUtils.copyProperties(admin2, admin);
//输出两个admin
System.out.println(admin);
System.out.println(admin2);
//map数据,拷贝到对象中
Map<String, Object> map=new HashMap<>();
map.put("userName","peace2");
map.put("age", 22);
map.put("id", 002);
map.put("pwd", 123456);
//通过Map拷贝:
BeanUtils.populate(admin,map);
System.out.println(admin);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
*
* @Title: testRegist
* @Description: 实现对不支持的类进行转换。
* @return:void
* @throws
* @author peace w_peace@163.com
*/
@Test
public void testRegist(){ // 注册日期类型转换器:1, 自定义的方式
ConvertUtils.register(new Converter() {
/**
* 转换函数,实现对date的转换。
*/
@Override
public Object convert(Class type, Object value) {
//判断是否为Date类型
if(type!=Date.class)
return null;
//判断是否为空
if(value==null||"".equals(value.toString().trim()))
return null;
try {
//转换方式
SimpleDateFormat date=new SimpleDateFormat("yyyy-mm-dd");
return date.parse(value.toString());
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}, Date.class);
//执行
Admin admin=new Admin();
Map<String, Object> map=new HashMap<>();
map.put("userName","peace2");
map.put("age", 22);
map.put("id", 002);
map.put("pwd", 123456);
map.put("birth", new Date(2015, 10, 9));
try {
BeanUtils.populate(admin,map);
System.out.println(admin);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
/**
*
* @Title: testRigest2
* @Description: 使用提供的date类型转换器
* @return:void
* @throws
* @author peace w_peace@163.com
*/
public void testRigest2(){
ConvertUtils.register(new DateConverter(), Date.class);
//执行
Admin admin=new Admin();
Map<String, Object> map=new HashMap<>();
map.put("userName","peace2");
map.put("age", 22);
map.put("id", 002);
map.put("pwd", 123456);
map.put("birth", new Date(2015, 10, 9));
try {
BeanUtils.populate(admin,map);
System.out.println(admin);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

5.Dbutils数据库JDBC专用工具也可以封装JavaBean:

commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。

下载链接:链接

此去只是简要介绍,后面jdbc教程中在做完整介绍使用如下:

    @Test
/**
*
* @Title: testQueryOne
* @Description: 使用组件提供的结果集对象封装数据。
* @return:void
* @throws
* @author peace w_peace@163.com
*/
public void testQueryOne(){
String sql="select * from admin where id=?";
//获取连接
connection=JdbcUtil.getConnection();
//创建Dbutils核心工具类
QueryRunner qr=new QueryRunner();
//查询返回单个对象
try {
//使用beanhandle进行封装
//参数依次为:连接,sql语句,结果处理器,位置参数
//查下你结果封装到Admin
Admin admin=qr.query(connection,sql, new BeanHandler<Admin>(Admin.class), 4);
System.out.println(admin);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

封装javaBean的方法介绍就到这里.来自一条小鲨鱼wpeace(rlovep.com)

几种封装javaBean的方法的更多相关文章

  1. 一种封装Retrofit的方法,可以自动解析Gson,回避Method return type must not include a type variable or wildcard: retrofit2.Call<T>的问题

    封装目的:屏蔽底层实现,提供统一接口,并支持Gson自动转化 最初封装: //请求方法 interface RequestListener { interface PostListener { @PO ...

  2. ABP+AdminLTE+Bootstrap Table权限管理系统第六节--abp控制器扩展及json封装以及6种处理时间格式化的方法

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 一,控制器AbpController 说完了Swagger ui 我们再来说一下abp对控制器的处理和json的封 ...

  3. 第九节: 利用RemoteScheduler实现Sheduler的远程控制 第八节: Quartz.Net五大构件之SimpleThreadPool及其四种配置方案 第六节: 六类Calander处理六种不同的时间场景 第五节: Quartz.Net五大构件之Trigger的四大触发类 第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法等)和Job(创建、关联

    第九节: 利用RemoteScheduler实现Sheduler的远程控制   一. RemoteScheduler远程控制 1. 背景: 在A服务器上部署了一个Scheduler,我们想在B服务器上 ...

  4. 在jsp提交表单的参数封装到一个方法里

    建议去看一下孤傲苍狼写的Servlet+JSP+JavaBean开发模式(http://www.cnblogs.com/xdp-gacl/p/3902537.html), 最好把他JavaWeb学习总 ...

  5. 乐字节Java|封装JavaBean、继承与权限修饰

    本文继续讲Java封装.上一篇:乐字节Java|GC垃圾回收机制.package和import语句 这次讲述JavaBean.继承与权限修饰 一. 封装javaBean 封装(Encapsulatio ...

  6. javascript四种类型识别的方法

    × 目录 [1]typeof [2]instanceof [3]constructor[4]toString 前面的话 javascript有复杂的类型系统,类型识别则是基本的功能.javascrip ...

  7. 总结Allegro元件封装(焊盘)制作方法[修整]

    总结Allegro元件封装(焊盘)制作方法 在Allegro系统中,建立一个零件(Symbol)之前,必须先建立零件的管脚(Pin).元件封装大体上分两种,表贴和直插.针对不同的封装,需要制作不同的P ...

  8. PHP封装Excel表方法使用流程

    今天总结了一下Excel表的封装和导出使用,原理 经常使用与一些日常报表, 数据报表, 实现方法比较简单, 一次封装, 简单的方法调用,简单~ 废话不多说,直接入正题, 先说下重要的参数要记住的东西 ...

  9. Python爬虫之三种网页抓取方法性能比较

    下面我们将介绍三种抓取网页数据的方法,首先是正则表达式,然后是流行的 BeautifulSoup 模块,最后是强大的 lxml 模块. 1. 正则表达式   如果你对正则表达式还不熟悉,或是需要一些提 ...

随机推荐

  1. soapUI参数中文乱码问题解决方法&soap UI工具进行web接口测试

    soapUI参数中文乱码问题解决方法 可能方案1: 字体不支持中文,将字体修改即可: file-preferences-editor settings-select font 修改字体,改成能显示中文 ...

  2. 获取set()和push()方法向值栈放的数据

    ------------------siwuxie095 获取 set() 方法向值栈放的数据 1.具体步骤 (1)在 Action 中使用 set() 方法向值栈放数据 (2)在 JSP 页面中从值 ...

  3. basicHttpBinding

    表示一个绑定,Windows Communication Foundation (WCF) 服务可以使用此绑定配置和公开能够与基于 ASMX 的 Web 服务和客户端通信的终结点以及符合 WS-I B ...

  4. Linux select/poll和epoll实现机制对比

    关于这个话题,网上已经介绍的比较多,这里只是以流程图形式做一个简单明了的对比,方便区分. 一.select/poll实现机制 特点: 1.select/poll每次都需要重复传递全部的监听fd进来,涉 ...

  5. [Jenkins]怎样在Jenkins上面启动服务器上的批处理脚本

    New Item 在Build --> Execute Windows batch command --> 里面填写: schtasks /run /tn Start_Hub_szotqa ...

  6. Java Thread系列(三)线程安全

    Java Thread系列(三)线程安全 一.什么是线程安全 线程安全概念:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的. 线程安全来 ...

  7. ADO.net开放式并发

    https://docs.microsoft.com/zh-cn/dotnet/framework/data/adonet/optimistic-concurrency 在多用户环境中,有两种用于更新 ...

  8. jquery对属性和特性的操作

    attribute(特性)和property(属性)是两个不同的概念.attribute表示HTML文档节点的特性,property表示DOM元素的属性 这些属性例如selectedIndex, ta ...

  9. CI框架入门教程

    1. URL常用的相关函数 url相关函数在辅助类url中第一,要使用它们必须先加载$this->load->helper('url')或者自动装载    site_url('控制器/方法 ...

  10. HTTP 499 状态码 nginx下 499错误

    日志记录中HTTP状态码出现499错误有多种情况,我遇到的一种情况是nginx反代到一个永远打不开的后端,就这样了,日志状态记录是499.发送字节数是0. 老是有用户反映网站系统时好时坏,因为线上的产 ...