一、异常描述
对象工具类定义内部类,并在Map转换对象时候因实例化问题报"java.lang.IllegalAccessException: Can not call newInstance() on the Class for java.lang.Class"、"java.lang.InstantiationException: test.ObjectReflectUtils$Student"、"java.lang.IllegalArgumentException: wrong number of arguments"异常问题,详情日志如下
java.lang.IllegalAccessException: Can not call newInstance() on the Class for java.lang.Class@b@ at java.lang.Class.newInstance0(Class.java:322)@b@ at java.lang.Class.newInstance(Class.java:310)@b@ at test.ObjectReflectUtils.mapToObj(ObjectReflectUtils.java:117)@b@ at test.ObjectReflectUtils.main(ObjectReflectUtils.java:229)@b@Exception in thread "main" java.lang.NullPointerException@b@ at test.ObjectReflectUtils.main(ObjectReflectUtils.java:231)@b@..@b@java.lang.InstantiationException: test.ObjectReflectUtils$Student@b@小木人@b@ at java.lang.Class.newInstance0(Class.java:342)@b@ at java.lang.Class.newInstance(Class.java:310)@b@ at test.ObjectReflectUtils.mapToObj(ObjectReflectUtils.java:118)@b@ at test.ObjectReflectUtils.main(ObjectReflectUtils.java:229)@b@Exception in thread "main" java.lang.NullPointerException@b@ at test.ObjectReflectUtils.main(ObjectReflectUtils.java:231)@b@.. @b@java.lang.IllegalArgumentException: wrong number of arguments@b@ at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)@b@ at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)@b@ at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)@b@ at java.lang.reflect.Constructor.newInstance(Constructor.java:513)@b@ at test.ObjectReflectUtils.mapToObj(ObjectReflectUtils.java:119)@b@ at test.ObjectReflectUtils.main(ObjectReflectUtils.java:230)@b@Exception in thread "main" java.lang.NullPointerException@b@ at test.ObjectReflectUtils.main(ObjectReflectUtils.java:232)
二、解决方法
1. 如下代码示例ObjectReflectUtils.Student内部类(完整代码示例参见其他文章),在mapToObj方法cla.newInstance()构成初始化
public class ObjectReflectUtils {@b@ @b@ public static class Student{@b@ @b@ private String name;@b@ private String classId;@b@ @b@ public Student(String name, String classId) {@b@ super();@b@ this.name = name;@b@ this.classId = classId;@b@ }@b@ .. @b@ public static Object mapToObj(Map map, Class cla) {@b@ if (cla == null) {@b@ return null;@b@ }@b@ Object obj = null;@b@ try {@b@// obj = Class.forName(cla.getClass().getName()).newInstance();@b@ obj = cla.newInstance();// 创建 JavaBean 对象@b@// obj =cla.getConstructors()[0].newInstance();@b@ } catch (Exception e1) {@b@ e1.printStackTrace();@b@ return null;@b@ }@b@ try {@b@ // 获取属性@b@ BeanInfo beanInfo = Introspector.getBeanInfo(cla);@b@ // 给 JavaBean 对象的属性赋值@b@ putValueToJavaBean(map, obj, beanInfo);@b@ } catch (Exception e) {@b@ e.printStackTrace();@b@ }@b@ return obj;@b@ } @b@ ..@b@ public static void main(String[] args) throws Exception{@b@ @b@ Map printMap=new HashMap();@b@ printMap.put("classId", "c01");@b@ printMap.put("name", "小木人");@b@ @b@ Student stu2=(Student)mapToObj(printMap,ObjectReflectUtils.Student.class);@b@ System.out.println("mapToOb:"+stu2.toString());@b@ @b@ }@b@}
2.从上面代码示例的cla.newInstance()构成初始化时,因为内部类public Student()构成函数造成IllegalAccessException异常,修改如下
public class ObjectReflectUtils {@b@ @b@ public static class Student{@b@ @b@ private String name;@b@ private String classId;@b@ @b@ public Student() {@b@ super();@b@ }@b@ public Student(String name, String classId) {@b@ super();@b@ this.name = name;@b@ this.classId = classId;@b@ }@b@ .. @b@ @b@}
3.运行问题解决