当前位置: 移动技术网 > IT编程>开发语言>Java > Java反射异常java.lang.IllegalAccessException

Java反射异常java.lang.IllegalAccessException

2020年07月31日  | 移动技术网IT编程  | 我要评论
抽取CRUD做父类
测试过程中调用出现如下异常:

Java反射非法访问异常
java.lang.IllegalAccessException: Class com.hope.dao.BaseDao can not
access a member of class com.hope.entity.User with modifiers “private”

错误信息:

java.lang.IllegalAccessException: Class com.hope.dao.BaseDao can not access a member of class com.hope.entity.User with modifiers "private"
	at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
	at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)
	at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)
	at java.lang.reflect.Field.set(Field.java:761)
/**
     * @param sql
     * @param cls   通过反射可以拿到具体类
     * @param param 可变参数,内部是数组
     * @param <T>
     * @return
     */
    public <T> List<T> findList(String sql, Class<T> cls, Object... param) {
        List<T> list = new ArrayList<T>();
        Connection conn = DBHelper.getConnection();
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            //获取数据库操作对象
            ps = conn.prepareStatement(sql);
            //占位符赋值
            for (int i = 0; i < param.length; i++) {
                ps.setObject(i + 1, param[i]);
            }
            //执行SQL  返回结果集
            rs = ps.executeQuery();
            //循环判断指定当前游标是第一行 是否有下一个值
            while (rs.next()) {
                //通过查询的结果集  转换成一个具体的实体类  进行给对象赋值
                T bean = rsToBean(rs, cls);
                list.add(bean);
            }
            return list;
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(conn, ps, rs);
        }
        return null;
    }
 /**
     * 将结果集中的 数据 转成一个 具体实体类
     *
     * @param rs  数据集
     * @param cls class对象
     * @param <T> 具体实例
     * @return
     */
    private <T> T rsToBean(ResultSet rs, Class<T> cls) {

        try {
            //将传过来的类对象实例化  给t实例化
            T t = cls.newInstance();
            ResultSetMetaData metaData = rs.getMetaData();//元数据  拿到表的结构
            int columnCount = metaData.getColumnCount();//数据表的所有列的数量
            for (int i = 0; i < columnCount; i++) {
                String columnLabel = metaData.getColumnLabel(i + 1);//metaData.getColumnLabel(i+1) 拿到第几列  例如:获取到列名 id/user_name/password
                //通过获取的字段名  获取值
                Object value = rs.getObject(columnLabel);
                //通过数据表中获取到的字段名  拿到  对象类中的属性名 field==com.hope.entity.User.id属性
                //getDeclaredField()  仅能获取类本身的属性成员(包括私有、共有、保护)
                Field field = cls.getDeclaredField(columnLabel);
                //setAccessible(true)进行暴力访问 忽略掉修饰符
                field.setAccessible(true);
                //给t类的field属性赋值value
                field.set(t, value);
            }
            return t;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

在这里插入图片描述
这里出现的异常

解决:
出现了IllegalAccessException异常,看了一下抛出的异常信息后,查看了反射的那个类中构造方法被private权限修饰符修饰了

private修饰的成员(变量和方法)语法上只能在本类中进行访问,但是也有例外,如果使用的是反射技术,可以通过setAccessible(true)进行暴力访问。在这里插入图片描述
这样就可以访问属性了

本文地址:https://blog.csdn.net/newHollow/article/details/107670665

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网