java.lang.NoSuchFieldException: iii at java.lang.Class.getDeclaredField(Unknown Source) 异常解决

通过反射获取表单中的值封装到JavaBean时,程序可以正常运转,但控制台报了一个异常

java.lang.NoSuchFieldException: iii
    at java.lang.Class.getDeclaredField(Unknown Source)

原因是访问了一个不存在的属性iii.

后续做测试的时候   将button标签 多添加了一个name属性 iii,  果不其然自己编写的反射代码 会报异常。

将button标签的 name属性去掉即可。  因为反射获取到的iii属性在  自己编写的JavaBean中找不到对应的属性。所以抛异常。

当然造成可能造成NoSuchFieldException异常原因有:

①没有对应字段;

②属性为私有时获取Field用的方法不是getDeclaredField。

 

 

下面记录以下自己编写的代码 

UserInfo 的JavaBean

package com.mwb.bean;

public class UserInfo {

	private Integer user_id;
	private String user_name;
	private String user_password;
	
	public UserInfo() {
		super();
		// TODO Auto-generated constructor stub
	}
	public UserInfo(Integer user_id, String user_name, String user_password) {
		super();
		this.user_id = user_id;
		this.user_name = user_name;
		this.user_password = user_password;
	}
	public Integer getUser_id() {
		return user_id;
	}
	public void setUser_id(Integer user_id) {
		this.user_id = user_id;
	}
	public String getUser_name() {
		return user_name;
	}
	public void setUser_name(String user_name) {
		this.user_name = user_name;
	}
	public String getUser_password() {
		return user_password;
	}
	public void setUser_password(String user_password) {
		this.user_password = user_password;
	}
	@Override
	public String toString() {
		return "userinfo [user_id=" + user_id + ", user_name=" + user_name + ", user_password=" + user_password + "]";
	}
	
	
	
}

登录页面 index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




登录主页

    
    
    
    
    
    
    
    


三种方式 将从表单请求的数据封装到JavaBean中 

方式1.硬编码 一个一个属性赋值

	   //方法一、从表单中提交的数据进行提取封装到userinfo JavaBean中   ( 硬编码 )
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		String user_name = request.getParameter("user_name");
		String user_password = request.getParameter("user_password");
		UserInfo user = EasyFactory.getNewInstance(UserInfo.class);
		user.setUser_name(user_name);
		user.setUser_password(user_password);
	  	//**************************************************************

 

方式2.通过反射方式 手动封装到JavaBean中


		//方法二、利用反射的方式进行封装  自己手动编写反射
		UserInfo user = EasyFactory.getNewInstance(UserInfo.class);
		Enumeration parameterNames = request.getParameterNames();
		while(parameterNames.hasMoreElements()) {
			//System.out.println(parameterNames.nextElement());
			String element = parameterNames.nextElement();
			Field field;
			try {
				field = user.getClass().getDeclaredField(element);
				field.setAccessible(true);
				field.set(user,request.getParameter(element));
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println("JavaBean:" + user);

 

方式3.通过使用自己编写的工具类EasyFactory+ MyUtils+ BeanUtils的方式 封装到JavaBean中

//方法三、使用自己编写的MyUtils工具类  BeanUtils 进行封装到JavaBean中
UserInfo user = EasyFactory.getNewInstance(MyUtils.class).converRequestToBean(request, UserInfo.class);

EasyFactory.java( 获取一个类的实例对象 )

package com.mwb.utils;
public class EasyFactory {

	
	public static  T getNewInstance(Class clazz) {
		T t = null;
		try {
			t = clazz.newInstance();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return t;
	}
}

 MyUtils.java

package com.mwb.utils;

import java.lang.reflect.InvocationTargetException;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.BeanUtils;

public class MyUtils {

	
	public  T converRequestToBean(HttpServletRequest request,Class clazz) {
		T t = null;
		
		try {
			t = clazz.newInstance();
			if(request!=null) {
				Enumeration parameterNames = request.getParameterNames();
				while(parameterNames.hasMoreElements()) {
					String tagName = parameterNames.nextElement();
					String tagValue = request.getParameter(tagName);
					//使用BeanUtils进行实体类的属性 反射设置
					BeanUtils.setProperty(t, tagName, tagValue);
				}
			}
			
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return t;
	}
}


    

 

你可能感兴趣的:(java,Exception,后端)