java 运用反射,模拟类似Struts2的参数注入

标签: java class struts 表单
13人阅读 评论(0) 收藏 举报
分类:

java 运用反射,模拟类似Struts2的参数注入

在Struts2中,当你在页面中运用form 表单向后台传值是,可以采取以下形式:

<form action="login.do">
        <input name="user.id" type="text" />
        <input name="user.card.loacl.china" type="text" />
    </form>

以上 通过 user.id / user.card.loacl.china 直接将表单页面中的值,注入到action中的对象中 (User),创建一个类模拟此功能。

  1. 创建对象
package com.ziv.bean;

import java.util.Arrays;

public class User {
    private Integer id;
    private String name;
    private String[] hibbit;
    private Integer[] op;
    private Card card = new Card();

    public void setOp(Integer[] op) {
        this.op = op;
    }
    public Integer[] getOp() {
        return op;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public String[] getHibbit() {
        return hibbit;
    }
    public void setHibbit(String[] hibbit) {
        this.hibbit = hibbit;
    }
    public Card getCard() {
        return card;
    }
    public void setCard(Card card) {
        this.card = card;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", hibbit="
                + Arrays.toString(hibbit) + ", op=" + Arrays.toString(op)
                + ", card=" + card + "]";
    }
}
package com.ziv.bean;

import java.util.Arrays;
import java.util.Date;
/*创建card 对象*/
public class Card {
private Integer id;
private String[] num;
private Date brith;
private Loacl loacl = new Loacl();

public void setNum(String[] num) {
this.num = num;
}
public String[] getNum() {
return num;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Date getBrith() {
return brith;
}
public void setBrith(Date brith) {
this.brith = brith;
}
public Loacl getLoacl() {
return loacl;
}
public void setLoacl(Loacl loacl) {
this.loacl = loacl;
}
@Override
public String toString() {
return "Card [id=" + id + ", num=" + Arrays.toString(num) + ", brith="
+ brith + ", loacl=" + loacl + "]";
}
}kage com.ziv.bean;

import java.util.Arrays;

public class Loacl {
    private Integer id;
    private String[] china;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String[] getChina() {
        return china;
    }
    public void setChina(String[] china) {
        this.china = china;
    }
    @Override
    public String toString() {
        return "Loacl [id=" + id + ", china=" + Arrays.toString(china) + "]";
    }

}

2.编写参数注入对象

package self.ziv.servlet.refect.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import com.ziv.bean.User;

/**
 * 
 * @author ziv
 *  封装自动注入参数的变懒
 */
public class ParameterInjection {
    /*  源对象对应action中要注入的实体类对象   */
    private Object obj;
    /*  对象的构建方法 */
    private Field field;
    /*  要注入的对象属性    */
    private String[] parms;
    /*  属性的值    */
    private Object valueParms;

    ParameterInjection(){}

    ParameterInjection(Object obj,String parm, Object valueParms){
        this.obj = obj;
        this.parms = parm.split("\\.");
        this.valueParms = valueParms;
        handleString();
    }
    /**
     * 创建参数对象
     */
    private void handleString(){
        try {
            for (int i = 1; i < parms.length; i++) {
                if(parms.length - 1 == i){                  
                    this.field = obj.getClass().getDeclaredField(this.parms[this.parms.length - 1]);
                    this.field.setAccessible(true);
                    this.field.set(this.obj, valueParms);
                }else{
                    Method getMet = this.obj.getClass().getMethod("get" + initcap(this.parms[i]));
                    this.obj = getMet.invoke(this.obj);
                }
            }
        } catch (Exception e) {
            System.out.println("ZIV -ERROR: Unknown Source -> maybe **" + this.parms[this.parms.length - 1] + "**  **get/set**");
            e.printStackTrace();
        }
    }
    /**
     * 參數注入
     */
    public void startHandleString(){
        handleString();
    }

    /**
     * 将一个字符串的首字母大写
     * @param str
     * @return
     */
    private String initcap(String str){
        return str.toUpperCase().substring(0,1) + str.substring(1,str.length());
    }
    /**
     * 設置 屬性 
     * @param parms 屬性的值
     */
    public void setParm(String parm) {
        this.parms = parm.split("\\.");
    }
    /**
     * 設置 屬性的值
     * @param parms 屬性的值
     */
    public void setValueParms(Object valueParms) {
        this.valueParms = valueParms;
    }
    /**
     * 要注入值的對象
     * @param obj
     */
    public void setObj(Object obj) {
        this.obj = obj;
    }

    //  測試
    public static void main(String[] args) {
        String parms = "user.card.loacl.china";
        User user = new User();
        ParameterInjection parameterInjection = new ParameterInjection();
        parameterInjection.setObj(user);
        parameterInjection.setParm(parms);
        parameterInjection.setValueParms(new String[]{"sdf","揚州"});
        parameterInjection.startHandleString();
        System.out.println(user.getCard().getLoacl().toString());
    }

}
查看评论

java 反射 模拟spring自动注入

基于反射和注解机制,简单模拟Spring解析Autowired注解的过程。 1、自定义Autowired注解,代码如下 package com.basic.reflect; import j...
  • pingnanlee
  • pingnanlee
  • 2015年05月22日 15:30
  • 3448

struts2的注入参数,获取值

struts2的注入参数,获取值
  • starjuly
  • starjuly
  • 2016年08月17日 23:25
  • 1462

利用反射简单模拟Spring的控制反转(Ioc)和依赖注入(DI)

利用反射简单模拟Spring的控制反转(Ioc)和依赖注入(DI) 1.配置文件(.properties)中配置要扫描的包: #扫描page对象的包 init.pageobj.Package = e...
  • wangxin1982314
  • wangxin1982314
  • 2015年12月08日 17:23
  • 1718

Java反射机制的应用-模拟Spring的依赖注入

采用Java的反射机制,结合XML文档解析,模拟Spring中的setter方法依赖注入。
  • fullStackChenZF
  • fullStackChenZF
  • 2017年07月12日 08:17
  • 507

3 手写实现SpringMVC,第三节:通过反射给属性和参数注入值

在上一篇已经完成了读取beanName->Object映射关系的功能,这一篇就是把读取到的映射注入到属性中。 在WebController里定义了需要被Autowired的两个Service,myQu...
  • tianyaleixiaowu
  • tianyaleixiaowu
  • 2017年06月30日 12:11
  • 1506

js中eval的使用可以达到java反射功能

javascript中eval的使用可以达到java反射的效果
  • Melody_Susan
  • Melody_Susan
  • 2016年04月08日 20:04
  • 1075

【java】基于java反射机制调用自定义类导致service注入失败的经验浅谈

使用场景:最近在做一个保费计算的方法,涉及到不同险种的计算,根据三方传来的request请求进行相应的保费计算。最开始用的方法是switch case形式,根据对方传来的id逐个判断属于哪种险种...
  • gao763024185
  • gao763024185
  • 2017年04月13日 16:09
  • 1092

Java反射的运用

JAVA 反射的应用还是比较多,这里会对反射的一些原理进行介绍,然后我们才知道如何使用和优化。至   于反射的使用介绍,这里就不在过多叙述了,API 上都介绍得有。    要了解JA...
  • weijinqian0
  • weijinqian0
  • 2016年08月25日 10:15
  • 158

java反射 -- 通过反射注入service/dao,进行UT测试

UT单元测试的时候,遇到一种情况就是service/dao为空,不能调用方法,一般情况下使用@Autowired,在项目启动后使用时就可以自动注入service/dao,但是使用junit单元测试时,...
  • baidu_28283827
  • baidu_28283827
  • 2017年09月04日 17:11
  • 484

Struts2中自定义拦截器导致Action注入参数丢失

写struts2项目时发现前台超链接中的参数无法传到action, 所有带有传递参数的均无法正常使用了,在Action中所有的参数无法被注入。 后来经过debug发现其中的页面都要先经过拦截器...
  • a956163985
  • a956163985
  • 2015年01月21日 16:45
  • 1947
    个人资料
    等级:
    访问量: 72
    积分: 46
    排名: 181万+
    文章分类
    文章存档