IllegalArgumentException 不知道错在什么地方?

jiugui 2016-08-21 09:35:23
这是错误的代码
java.lang.IllegalArgumentException: Could not find field [LOCATION] on target [Student [flowID=0, type=0, idCard=null, examCard=null, studentName=null, location=null, grade=0]]
at Lianxi.ReflectionUtils.setFieldValue(ReflectionUtils.java:149)
at Lianxi.ExamStudent.get(ExamStudent.java:98)
at Lianxi.ExamStudent.testGet(ExamStudent.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
我的目的是通过泛型和反射,创建一个通用的查询方法,利用ResultSetMeatData获得数据库列的别名,进而获得查询结果
以下是主程序:
public void testGet(){
String sql="select flowid flowID ,type,idcard idCard,examcard examCard,"
+ "studentname studentName,location,grade "
+ "from examstudent where flowid= ?";
//System.out.println(sql);
Student stu=get(Student.class, sql, 1);
System.out.println(stu);
}
public <T> T get(Class <T> clazz,String sql,Object ...args){
T entity=null;
Connection connection=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
//1.获得ResultSet对象
connection=JDBCTools.getConnection();
ps=connection.prepareStatement(sql);
for(int i=0;i<args.length;i++){
ps.setObject(i+1, args[i]);
}
rs=ps.executeQuery();
//2.获取ResultSetMetaData对象
ResultSetMetaData rsmd=rs.getMetaData();
//3.创建Map<K,V>对象,键:ResultSetMeatData获取的列的别名,值:SQL结果集里的值
Map<String, Object> values=new HashMap<>();
//4.处理结果集,用ResultSetMetaData对象填充3对应的Map对象
while(rs.next()){
for(int i=0;i<rsmd.getColumnCount();i++){
String columnName=rsmd.getColumnLabel(i+1);
Object columnValue=rs.getObject(i+1);
values.put(columnName, columnValue);
}
}
//5.若Map对象不为空,利用反射创建clazz对应的对象
if(values.size()>0){
entity=clazz.newInstance();
//遍历Map集,利用反射为创建的clazz对象的各属性赋值;
for(Map.Entry<String, Object> entry:values.entrySet()){
String filename=entry.getKey();
Object value=entry.getValue();
ReflectionUtils.setFieldValue(entity, filename, value);
}
}

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCTools.releaseResult(rs, ps, connection);
}
return entity;
}
下面的是ReflectionUtils
public class ReflectionUtils {
/**
* 使 filed 变为可访问
*/
public static void makeAccessible(Field field){
if(!Modifier.isPublic(field.getModifiers())){
field.setAccessible(true);
}
}

/**
* 循环向上转型, 获取对象的 DeclaredField
*/
public static Field getDeclaredField(Object object, String filedName){

for(Class<?> superClass = object.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()){
try {
return superClass.getDeclaredField(filedName);
} catch (NoSuchFieldException e) {
//Field 不在当前类定义, 继续向上转型
}
}
return null;
}
/**
* 直接设置对象属性值, 忽略 private/protected 修饰符, 也不经过 setter
*/
public static void setFieldValue(Object object, String fieldName, Object value){
Field field = getDeclaredField(object, fieldName);

if (field == null)
throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + object + "]");
makeAccessible(field);
try {
field.set(object, value);
} catch (IllegalAccessException e) {
System.out.println("不可能抛出的异常");
}
}
...全文
316 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
skgary 2016-08-22
  • 打赏
  • 举报
回复
student 对像没有getLOCATION之类的方法呗。 建议用Location而非LOCATION.

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧