JAVA 实现简单的反射

问题由来:需要大量实现某个功能,需要根据不同链接调用不同方法,并返回类似信息,但是又不同

1.将不同链接抽出一个Enum对象

例:根据不同的链接,返回的内容相似,

根据穿入的是student还是class,返回对应的表的表头和显示的条数

public enum TableHeadEnum {
   //简单举例
    STUDENT("student","<tr><th>序号</th><th>姓名</th><th>性别</th><th>年龄</th></tr>",5),
    CLASS("class","<tr><th>序号</th><th>年级</th><th>班级</th><th>人数</th></tr>",3),
    ;


    /**
     * 前台请求的url
     */
    private String url;
    /**
     * 需要查询的表头
     */
    private String tableHead;
    /**
     * 需要显示的数据
     */
    private Integer size;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getTableHead() {
        return tableHead;
    }

    public void setTableHead(String tableHead) {
        this.tableHead = tableHead;
    }

    public Integer getSize() {
        return size;
    }

    public void setSize(Integer size) {
        this.size = size;
    }

    TableHeadEnum(String url, String tableHead, Integer size) {
        this.url = url;
        this.tableHead = tableHead;
        this.size = size;
    }
 
     //根据不同的url返回不同的 TableHeadEnum 对象
    public static TableHeadEnum getTableHeadEnum(String url){
        for (TableHeadEnum tableHeadEnum : TableHeadEnum.values()) {
            String uurl=tableHeadEnum.url.toLowerCase();
            if (url.toLowerCase().equals(uurl)){
                return tableHeadEnum;
            }
        }
        return null;
    }


}

2.将业务逻辑部分根据URL反射

将所有反射的方法名统一格式,方便拼接调用(也可以在定义enum 的时候加一个方法名的属性)

   public String getSuggestions(MessageQuery messageQuery) throws Exception {
        TableHeadEnum tableHeadEnum = TableHeadEnum.getTableHeadEnum(messageQuery.getDataUrl());
        //得到的enum类为空,直接返回
        if (isEmpty(tableHeadEnum)){
            return "";
        }
        messageQuery.setSize(tableHeadEnum.getSize());
        //所有的方法是 get+dataUrl拼接起来的
        messageQuery.setMethodName("get"+messageQuery.getDataUrl());
        //从枚举类得到定义的表头
        String head=tableHeadEnum.getTableHead();
        //调用方法获取表格信息内容
        String body=getMes(messageQuery);
        //拼接表头(enum定义)和表格数据(反射获取)
        head+=body;
        return head;
    }


/**
 *MessageQuery 是我根据该条件查询值
**/

@Autowired
    MessageResult message; //将所有通过反射实现的方法放到某一个统一的类中
    public String getMes(MessageQuery messageQuery)throws Exception{
        Class clz = messageQuery.getClass();
        Method m = clz.getMethod(messageQuery.getMethodName(), messageQuery.getClass());
        //执行对应的方法,获取返回值(需要把我查询条件一起传过去)
        String string=(String) m.invoke(message,messageQuery);
        return string;
    }

3.将反射的类定义,并写里面的方法逻辑

@Component//因为要用到dao层或者service层,需要将反射的类注入到spring容器
public class SuggestionsResult {
    @Autowired
    DataDao runDataDao;
    /**
     * 获取student信息
     */
    public String getstudent(MessageQuery){
        //实现逻辑,返回拼好的表格body
        return "";    
    }
    /**
     * 获取班级信息
     */
     public String getclass(MessageQuery){
        //实现逻辑,返回拼好的表格body  
        return "";  
    }
}

注:可能会出现在反射的类中无法使用 @Autowire 注入dao层,原因可能是未将自定义实现逻辑的类注入到spring中

注注:小白代码,如有疑问,欢迎大佬指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值