CSDNRGY 2017-05-17 00:09 采纳率: 88.2%
浏览 2095
已采纳

如何根据注解动态调用set方法?

如何根据注解动态调用set方法?
我想实现,excel表格动态注入到List中
这是表格数据和Emp类
图片说明
现在已经可以让,表格的头和Emp类的注解的进行关联
但是我不知道如何实现动态的调用emp对象的set方法
即使不调用set方法,直接通过属性注入也行
但是我不知道怎么写了

 public class Demo0<T> {

    public static void main(String[] args) throws Exception {
        List<Emp> emps = new ArrayList<>();
        //excel表
        Workbook wb = new XSSFWorkbook("d:/员工.xlsx");
        int sheetLength = wb.getNumberOfSheets();
        //遍历sheet
        for (int i = 0; i < sheetLength; i++) {
            Sheet sheet = wb.getSheetAt(i);
            int rowLength = sheet.getPhysicalNumberOfRows();
            //遍历行
            for (int j = 0; j < rowLength; j++) {
                Emp emp = new Emp();
                Row row = sheet.getRow(j);
                int cellLength = row.getPhysicalNumberOfCells();
                //遍历列
                for (int k = 0; k < cellLength; k++) {
                    Cell cell = row.getCell(k);
                    String cellValue = cell.getStringCellValue();
                    System.out.print(cellValue+"\t");
                    /*----------开始自动关联了-----------*/
                    //获取当前sheet的第一行,也就是excel的表头
                    Row title = sheet.getRow(0);
                    //获取当前列的表头的值
                    Cell titleCell = title.getCell(k);
                    String titleCellValue = titleCell.getStringCellValue();
                    //如何自动映射?
                    //获取Emp类的属性
                    Field[] fields = Emp.class.getDeclaredFields();
                    for (int l = 0; l < fields.length; l++) {
                        Field field = fields[l];
                        //根据属性,获取Excel注解
                        ExcelField ef = field.getDeclaredAnnotation(ExcelField.class);
                        //获取注解的值
                        String anTitle = ef.title();

                        //注解的值和excel标题的值相同的时候
                        //就把excel中当前列的值,注入到emp对象对应的属性中
                        /*******重点*****/
                        /*******如何根据注解,动态调用set方法?*****/
                        if(titleCellValue.equals(anTitle)){
                            emp.setEmpId(cellValue);
                            continue;
                        }
                        if(titleCellValue.equals(anTitle)){
                            emp.setEname(cellValue);
                            continue;
                        }
                    }
                }
                emps.add(emp);
                System.out.println();
            }
        }
        System.out.println(emps);
    }
}
 public class Emp {

    @ExcelField(title = "员工姓名")
    public String ename;
    @ExcelField(title = "员工编号")
    public String empId;

    public Emp() {
    }

    public Emp(String empId, String ename) {
        this.empId = empId;
        this.ename = ename;
    }

    public String getEmpId() {
        return empId;
    }

    public void setEmpId(String empId) {
        this.empId = empId;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    @Override
    public String toString() {
        return "Emp [ename=" + ename + ", empId=" + empId + "]";
    }

}
 @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelField {
    String title();
}

展开全部

  • 写回答

1条回答 默认 最新

  • 时间在这里停顿 2017-05-17 01:34
    关注

    你可以试一下把Field换成Method,invoke可以调用该方法表示的底层方法

    //动态加载类
    Class cls=Class.forName(Emp);
    //动态获取全部方法信息
    Method[] ary=cls.getDeclaredMethods();
    //创建类的实例
    Object obj = cls.newInstance();
    //迭代全部方法查找以set为开头的方法
    for (Method method : ary) {
        ExcelField ann=method.getAnnotation(ExcelField.class);
        if(titleCellValue.equals(ann.title())){
            //动态执行方法
            method.invoke(obj, cellValue);
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
编辑
预览

报告相同问题?

悬赏问题

  • ¥15 全志t113i启动qt应用程序提示internal error
  • ¥15 ensp可以看看嘛.
  • ¥80 51单片机C语言代码解决单片机为AT89C52是清翔单片机
  • ¥60 优博讯DT50高通安卓11系统刷完机自动进去fastboot模式
  • ¥15 minist数字识别
  • ¥15 在安装gym库的pygame时遇到问题,不知道如何解决
  • ¥20 uniapp中的webview 使用的是本地的vue页面,在模拟器上显示无法打开
  • ¥15 网上下载的3DMAX模型,不显示贴图怎么办
  • ¥15 关于#stm32#的问题:寻找一块开发版,作为智能化割草机的控制模块和树莓派主板相连,要求:最低可控制 3 个电机(两个驱动电机,1 个割草电机),其次可以与树莓派主板相连电机照片如下:
  • ¥15 潜在扩散模型的Unet特征提取
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部