日期:2014-05-20  浏览次数:21023 次

关于反射的小问题
这两天无聊,想做一个打包Excel的小插件。

思路是这样的:

一、给出一个List<Model>,
二、遍历list逐个得到model。
三、通过反射获取model中变量名、public的getXXX方法。
四、写入Excel。

但是这儿出了一个很大的问题:

反射时得到的mothod.invoke(Object)方法Object必须实例化,也就是说其中肯定不可能有数据!

我就不明白怎么整了,问了一些人表示这个不可能。

我的理解大概是这样的、

能得到Class的各种信息相当于类对象在内存里面的位置已经显式的存在了。
List中的每个Model里面的数据应该也是能提取得到的,但是我就是不知道怎么整。
------解决方案--------------------
public class Test {
public static void main(String[] args) throws IllegalArgumentExceptionIllegalAccessExceptionInvocationTargetException {
List<Model> list = new ArrayList<Model>();
for (int i = 0; i < 10; i++) {
list.add(new Model("model"+i));
}

Method[] methods = Model.class.getMethods();
for (Model model : list) {
for (Method method : methods) {
if(method.getName().equalsIgnoreCase("getName")){
System.out.println(method.invoke(model));
}
}
}
}

}
class Model{
private String name;

public Model(){
}
public Model(String name){
this.name = name;
}


public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}

希望能帮到你
------解决方案--------------------
还是没看懂lz要做什么,是要将类里面的字段 getXXX方法呢 存到excel里面呢 还是要反射获取对象属性的值呢

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;


public class A {


private String id;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public A(String s){
this.id = s;
}


public static void main(String[] args) {
//反射获取方法
Method[] ms = A.class.getDeclaredMethods();//
for(Method m:ms){
System.out.println(m.getName());
}
//反射获取属性
Field[] fs = A.class.getDeclaredFields();
for(Field f : fs){
System.out.println(f.getName());
}
//反射获取构造函数
Constructor[] cs = A.class.getConstructors();
for(Constructor c : cs){
System.out.println(c.getName());
}

//先初始化
List<A> l = init();
//反射获取属性的值
for(A a : l){
for(Field f : a.getClass().getDeclaredFields()){
try {
System.out.println(f.getName()+":"+f.get(a));//可以看做在此写入Excel
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}
}

public static List<A> init(){
List<A> l = new ArrayList<A>();
for(int i = 0;i<100;i++){
l.add(new A(i+""));
}
return l;
}
}


这种?
------解决方案--------------------
给你一段写的代码,看你能理解不

package com.poi.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ExcelHeaderTitle {
String name();
int index();
int colSpan() default 1;
boolean export();
}


package com.poi.export;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.RegionUtil;

import com.poi.annotation.ExcelHeaderTitle;
import com.poi.bean.TestBean;

public class ExcelExporter {

public static void main(String[] args) throws Exception {
FileOutputStream out = new FileOutputStream("G:\\test.xls");
ExcelExporter ex = new ExcelExporter();
List<TestBean> testBeans = new ArrayList<TestBean>();