反射
反射是运行期间的行为
单例模式防反射
package com.mage.reff;
public class Lazy {
private static Lazy lazy;
private Lazy() {
if(lazy != null) {
throw new RuntimeException("让你丫反我野");
}
}
public static Lazy getInstance() {
if(lazy == null) {
lazy = new Lazy();
}
return lazy;
}
public Object readResolve() {
return lazy;
}
}
Class类
这个类产生的一个实例对象用来描述某个类的
class<Student>这个对象描述的就是Class类。
所有的Student的对象和Student都共享该Class对象
举例:
class<String>
三种:
*Class.forName(需要获取类的权限定名:包名.类名)(最常见)
*类名.Class
*class对象.getClass(获取父类的class对象)
package com.mage.reff;
public class Test01 {
public static void main(String[] args) throws ClassNotFoundException {
Class clz = Class.forName("java.util.Scanner");
System.out.println(clz);
Class clzs = String.class;
System.out.println(clz==clzs);
Class clz1 = "hanbao".getClass();
Class clz2 = "hehhe".getClass();
System.out.println(clz1==clz2);
System.out.println(clz1==clzs);
System.out.println(clz2==clzs);
System.out.println(clz2.getSuperclass());
}
}
package com.mage.reff;
import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class ExportPoi {
public static void main(String[] args) {
List<Student> ls = new ArrayList<>();
ls.add(new Student("关羽",1,1,67));
ls.add(new Student("刘备",2,1,80));
ls.add(new Student("张飞",3,1,56));
ls.add(new Student("曹操",4,1,90));
export(Student.class,ls,"学生成绩单.xls","C:\\Users\\Administrator\\Desktop",new String[] {"姓名","学号","性别","成绩"},new String[] {"name","id","gender","score"});
}
/**
* @param clz 导出集合对象中每个元素的Class对象
* @param ls 导出的集合对象
* @param fileName 导出的文件名称
* @param filePath 导出的文件路径
* @param titls 导出文件的标题
* @param fieldName 导出集合中对象的每个属性名称(英文)
* @throws IllegalAccessException 属性的是不可见 抛出该异常
* @throws IllegalArgumentException 非法参数异常
* @throws IOException 连接错误
* */
public static void export(Class<?> clz,List<?> ls, String fileName,String filePath,String[] titles,String[] fileldName) throws IllegalArgumentException, IllegalAccessException, IOException {
// 创建工作簿对象
Workbook wb = new HSSFWorkbook();
//创建流对象
FileOutputStream fs = new FileOutputStream(filePath+File.separator+fileName);
//创建流对象
Sheet sheet = wb.creatSheet(fileName.substring(0,fileName.indexOf(".")));
//创建row
Row rowTitle = sheet.creatRow(0);
//创建单元格
for(int i = 0;i<titles.length;i++) {
//创建单元格
Cell cell = rowTitle.creatCell(i);
//填充值
cell.setCellValue(titles[i]);
}
//添加数据 循环创建List长度个row
for(int i =0;i<ls.size();i++) {
//创建row
Row rowData = sheet.creatRow(i+1);//行数据
Field[] f = clz.getDeclaredFields();
for(int j =0;j<titles.length;j++) {
//创建单元格
Cell cell = rowDate.createCell(j);
//获取属性名称
f[j].setAccessible(true);
cell.setCellValue(f[j].get(ls.get(i)).toString());
f[j].setAccessible(false);
}
}
//写出
wb.write(fs);
//关闭
fs.close();
wb.close();
}
}
class Student{
private int id;
private String name;
private int gender;
private int score;
public Student() {
// TODO Auto-generated constructor stub
}
public Student(String name, int id, int gender, int score) {
super();
this.name = name;
this.id = id;
this.gender = gender;
this.score = score;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student [name=" + name + ", id=" + id +", gender=" + gender + ", score=" + score + "]";
}
}