需要jxl.jar

package com.rainmer.main;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList; import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException; import com.rainmer.bean.Book; public class ExcleBook {
public void excleOut(ArrayList<Book> ar){
WritableWorkbook book = null;//excle对象
try{
//创建excle对象
book = Workbook.createWorkbook(new File("G:/book.xls"));
//通过excle对象创建一个选项卡对象
WritableSheet sheet = book.createSheet("sheet", 0);
for (int i = 0; i < ar.size(); i++) {
//创建一个单元格对象
Label la0 = new Label(0,i,String.valueOf(ar.get(i).getId()));
Label la1 = new Label(1,i,ar.get(i).getName());//创建单元格。参数说明:列,行,值
Label la2 = new Label(2,i,ar.get(i).getType());
//将创建好的单元格对象放入选项卡中
sheet.addCell(la0);
sheet.addCell(la1);
sheet.addCell(la2);
}
//写入目标路径
book.write();
}catch(Exception e){
e.printStackTrace();
}finally{
try {
book.close();
} catch (WriteException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } public ArrayList<Book> excleIn(){
ArrayList<Book> ar = new ArrayList<Book>();
Workbook book = null;
try{
book = Workbook.getWorkbook(new File("G:/book.xls"));
Sheet sheet = book.getSheet(0);
for (int i = 0; i < sheet.getRows(); i++) {
Book bo = new Book();
Cell cell = sheet.getCell(0,i);//Cell读取的时候的单元格,列,行
bo.setId(Integer.valueOf(cell.getContents()));
bo.setName(sheet.getCell(1, i).getContents());
bo.setType(sheet.getCell(2, i).getContents());
ar.add(bo);
}
}catch(Exception e){
e.printStackTrace();
}finally{
book.close();
}
return ar;
} public static void main(String[] args) {
ExcleBook book = new ExcleBook(); ArrayList<Book> ar = new ArrayList<Book>();
Book bo1 = new Book();
bo1.setId(1);
bo1.setName("火影之鸣人重生");
bo1.setType("同人");
Book bo2 = new Book();
bo2.setId(2);
bo2.setName("我和我的老婆大人");
bo2.setType("都市");
ar.add(bo1);
ar.add(bo2); book.excleOut(ar); ArrayList<Book> result = book.excleIn();
for (int i = 0; i < result.size(); i++) {
System.out.println(result.get(i).getName());
}
}
}

运行结果:

调用了setName方法
调用了setName方法
调用了getName方法
调用了getName方法
调用了setName方法
调用了setName方法
调用了getName方法
火影之鸣人重生
调用了getName方法
我和我的老婆大人

——————————————————————————————————————————————————————————————————————————

  如果有一个项目,要求你实现图书信息导入导出,用户信息导入导出,借阅信息导入导出,维护信息导入导出,管理信息导入导出......。利用反射可以很好地实现代码重用。

package com.rainmer.util;

import java.io.File;
import java.lang.reflect.Field;
import java.util.ArrayList; import jxl.Sheet;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook; import com.rainmer.bean.Book; public class ExcleUtil { //如果有一个项目,
//要求你实现图书信息导入导出,用户信息导入导出,借阅信息导入导出,维护信息导入导出,管理信息导入导出。。。。。
public void excleOut(ArrayList ar, String str){
WritableWorkbook book = null;
try {
book = Workbook.createWorkbook(new File(str));
WritableSheet sheet = book.createSheet("sheet", 0);
for(int i = 0;i<ar.size();i++){
Object ob = ar.get(i);
Class cl = ob.getClass();
Field[] fi = cl.getDeclaredFields();
for(int j = 0;j<fi.length;j++){
fi[j].setAccessible(true);
Label la = new Label(j, i, String.valueOf(fi[j].get(ob)));
sheet.addCell(la);
}
}
book.write();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
book.close();
} catch (Exception e) {
e.printStackTrace();
}
}
} public ArrayList excleIn(Class cl, String str){
ArrayList ar = new ArrayList();
Workbook book = null;
try{
book = Workbook.getWorkbook(new File(str));
Sheet sheet = book.getSheet(0);
Field[] fi = cl.getDeclaredFields();
for (int i = 0; i < sheet.getRows(); i++) {
Object ob = cl.newInstance();
for (int j = 0; j < fi.length; j++) {
fi[j].setAccessible(true);
String con = sheet.getCell(j, i).getContents();
if(fi[j].getType().toString().equals("class java.lang.String")){
fi[j].set(ob, con);
}else if(fi[j].getType().toString().equals("int")){
fi[j].setInt(ob, Integer.valueOf(con));
}
}
ar.add(ob);
}
}catch(Exception e){
e.printStackTrace();
}
return ar;
} public static void main(String[] args) {
ExcleUtil util = new ExcleUtil();
ArrayList<Book> ar = new ArrayList<Book>();
Book bo1 = new Book();
bo1.setId(1);
bo1.setName("火影之鸣人重生");
bo1.setType("同人");
Book bo2 = new Book();
bo2.setId(2);
bo2.setName("我和我的老婆大人");
bo2.setType("都市");
ar.add(bo1);
ar.add(bo2);
util.excleOut(ar, "G:/bookA.xls");

      ArrayList<Book> result = util.excleIn(Book.class, "G:/book.xls");
      for (Book book : result) {
        System.out.println("id="+book.getId()+";name="+book.getName()+";type="+book.getType());
      }

    }
}

运行结果:

调用了setName方法
调用了setName方法
调用了getName方法
id=1;name=火影之鸣人重生;type=同人
调用了getName方法
id=2;name=我和我的老婆大人;type=都市

java反射机制入门04的更多相关文章

  1. java反射机制入门01

    java反射机制入门是我从极客学院的视频中学习的. 1.反射机制背景概述 反射(Reflection)是java被视为动态(或准动态)语言的一个关键性质.反射机制指的是程序在运行时能够获取任何类的内部 ...

  2. java反射机制入门3

    Method对象的机制与实现 1.Method对象概述 1)java.lang.reflect.Method类是用于表示类中.接口中方法对象的类. 2)可以操作类中私有,以及公有等全部方法. 2.Me ...

  3. java反射机制入门02

    Field对象的机制与实现 1.Field对象概述 1)Java.lang.reflect.Field类,是用于表示类中.接口中属性对象的类. 2)可以操作类中私有,以及公有等全部属性和属性的信息. ...

  4. Java反射机制详解(1) -反射定义

    首先,我们在开始前提出一个问题: 1.在运行时,对于一个java类,能否知道属性和方法:能否去调用它的任意方法? 答案是肯定的. 本节所有目录如下: 什么是JAVA的反射机制 JDK中提供的Refle ...

  5. 大白话说Java反射:入门、使用、原理

    文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java反射:入门.进阶.原理> 反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释. 一般情况下,我们使用某个类时 ...

  6. JAVA反射机制及理解

    JAVA反射 往往当我们面对一项新的知识时,我们往往需要知道三个方面,它是什么,它能做什么,它比原有知识强在哪里,我们该怎么使用它.当你能够解决这些问题时,便意味着你已经对这项知识入门了. 首先: 反 ...

  7. Java 反射机制(包括组成、结构、示例说明等内容)

    第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还原“类的全部的信息”.这里“类的部分已经的信息”,可以是“类名”或“类的对象” ...

  8. Java 反射机制介绍

    参考文章:http://www.cnblogs.com/skywang12345/p/3345205.html Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还 ...

  9. Java反射机制的浅显理解(这篇文章还没写好,留个草稿给自己看的)

    目前只是有一个大概的理解,先把自己感觉容易立即的概念放这里,等以后结合实际工作理解深刻了再来补充. 一.什么是Java反射机制?(多种定义) 1. JAVA反射机制是在运行状态中,对于任意一个类,都能 ...

随机推荐

  1. svn添加强制注释,pre-commit结合python

    鉴于组内有些人在提交代码的时候并不写注释,而且没有固定格式,所以准备给svn提交时增加强制注释. 首先找到代码库里的hooks目录,正常建svn库的时候都有这个目录.进入hooks目录,找到pre-c ...

  2. CSS Flex

    关于flex 请看这里  https://css-tricks.com/snippets/css/a-guide-to-flexbox/ 太详细啦!!!  还通俗易懂!!! 没啥好说的 不过上面那篇文 ...

  3. angular的$q服务和promise模式

    此承诺/延迟(promise/deferred)实现的灵感来自于 Kris Kowal's Q CommonJS Promise建议文档 将承诺(promise) 作为和 异步执行操作(action) ...

  4. Scale-up(纵向扩展) vs Scale-out(横向扩展)

    转载:http://wuaner.iteye.com/blog/1843799 http://www.javaworld.com/article/2077780/java-web-developmen ...

  5. JWPlayer 初探

    http://www.360doc.com/content/13/0103/22/21412_258041878.shtml JWPlayer 是一款比较实用的web flash 播放器

  6. 多线程中Local Store Slot(本地存储槽)

    在Java中有一种ThreadLocal机制,为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突.从线程的角度看,就好像每一个线程都完全 ...

  7. Evernote Clearly :: Firefox 附加组件

    Evernote Clearly :: Firefox 附加组件 Evernote Clearly 10.1.1.2 作者: Evernote Evernote Clearly 可使博客贴文.文章和网 ...

  8. HDU1046:Gridland

    Problem Description For years, computer scientists have been trying to find efficient solutions to d ...

  9. curl之post提交xml

    直接上代码: /** * 以post方式提交xml到对应的接口url * * @param string $xml 需要post的xml数据 * @param string $url url * @p ...

  10. C++之static_cast, dynamic_cast, const_cast

    转自:http://www.cnblogs.com/chio/archive/2007/07/18/822389.html 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 ...