java反射机制入门04
需要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的更多相关文章
- java反射机制入门01
java反射机制入门是我从极客学院的视频中学习的. 1.反射机制背景概述 反射(Reflection)是java被视为动态(或准动态)语言的一个关键性质.反射机制指的是程序在运行时能够获取任何类的内部 ...
- java反射机制入门3
Method对象的机制与实现 1.Method对象概述 1)java.lang.reflect.Method类是用于表示类中.接口中方法对象的类. 2)可以操作类中私有,以及公有等全部方法. 2.Me ...
- java反射机制入门02
Field对象的机制与实现 1.Field对象概述 1)Java.lang.reflect.Field类,是用于表示类中.接口中属性对象的类. 2)可以操作类中私有,以及公有等全部属性和属性的信息. ...
- Java反射机制详解(1) -反射定义
首先,我们在开始前提出一个问题: 1.在运行时,对于一个java类,能否知道属性和方法:能否去调用它的任意方法? 答案是肯定的. 本节所有目录如下: 什么是JAVA的反射机制 JDK中提供的Refle ...
- 大白话说Java反射:入门、使用、原理
文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java反射:入门.进阶.原理> 反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释. 一般情况下,我们使用某个类时 ...
- JAVA反射机制及理解
JAVA反射 往往当我们面对一项新的知识时,我们往往需要知道三个方面,它是什么,它能做什么,它比原有知识强在哪里,我们该怎么使用它.当你能够解决这些问题时,便意味着你已经对这项知识入门了. 首先: 反 ...
- Java 反射机制(包括组成、结构、示例说明等内容)
第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还原“类的全部的信息”.这里“类的部分已经的信息”,可以是“类名”或“类的对象” ...
- Java 反射机制介绍
参考文章:http://www.cnblogs.com/skywang12345/p/3345205.html Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还 ...
- Java反射机制的浅显理解(这篇文章还没写好,留个草稿给自己看的)
目前只是有一个大概的理解,先把自己感觉容易立即的概念放这里,等以后结合实际工作理解深刻了再来补充. 一.什么是Java反射机制?(多种定义) 1. JAVA反射机制是在运行状态中,对于任意一个类,都能 ...
随机推荐
- iOS 开源库
youtube下载神器:https://github.com/rg3/youtube-dl我擦咧 vim插件:https://github.com/Valloric/YouCompleteMevim插 ...
- 在Windows环境下部署Axis2/C服务
Apache Axis2/C是C语言实现的网络服务引擎,基于Axis2架构,支持SOAP1.1和SOAP1.2协议,并且支持RESTful风格的Web service. 下面是本人在Windows 7 ...
- DelphiXe5中的双向绑定(使用使用TBindScope和TBindExpression,并覆盖AfterConstruction函数)
在Delphi下等这一功能很久了,虽然C#下早已实现了这一功能.但是在Dephi下尝试这项功能时还是有些许的激动.闲言少絮,直接上代码. unit BindingDemo; interface use ...
- Qt信息隐藏(Q_D/Q_Q)介绍——从二进制兼容讲起
http://www.cnblogs.com/SkylineSoft/articles/2046404.html
- VM 映像
让我们一起欢呼吧!随着最近Microsoft Azure运行时的发布,我们非常高兴地宣布发布 OS映像的继承性产品:新 VM映像.等一下-有些人可能会觉得这听起来有点耳熟.没错,一个月前在旧金山 ...
- python import 自己的包
在写python时,有时候写的一个python文件可能需要被其他python文件所用,那么可以用导入包 import 的 方式: 1.自己写的包放到哪里? >>> import sy ...
- hdu 4497 GCD and LCM(2013 ACM-ICPC吉林通化全国邀请赛——题目重现)
质分解 + 简单计数.当时去比赛的时候太年轻了...这道题都没敢想.现在回过头来做了一下,发现挺简单的,当时没做这道题真是挺遗憾的.这道题就是把lcm / gcd 质分解,统计每个质因子的个数,然后 ...
- 飘逸的python - 有的升序有的降序的情况下怎么多条件排序
之前在统计导出各区服玩家消费的时候需要进行升序降序混搭的多条件排序. 需求是这样的.区服从小到大排,如果区服相同,则按消费从大到小排. 实现方法是利用python的sort算法是稳定排序,对数据进行多 ...
- distributor之Interrupt Set/Clear-Active Registers, GICD_IS/CACTIVERn
set active寄存器.顾名思义就是把一个中断置为active状态,clear active寄存器就是清除active状态,在这里我们有必要说明一下中断状态的一些概念: active状态:假设此时 ...
- Android UI设计
Android UI设计--PopupWindow显示位置设置 摘要: 当点击某个按钮并弹出PopupWindow时,PopupWindow左下角默认与按钮对齐,但是如果PopupWindow是下图的 ...