欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java反射异常java.lang.IllegalAccessException

程序员文章站 2022-12-20 11:57:34
抽取CRUD做父类测试过程中调用出现如下异常:Java反射非法访问异常java.lang.IllegalAccessException: Class com.hope.dao.BaseDao can notaccess a member of class com.hope.entity.User with modifiers “private”错误信息:java.lang.IllegalAccessException: Class com.hope.dao.BaseDao can not a....
抽取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;
    }

Java反射异常java.lang.IllegalAccessException
这里出现的异常

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

private修饰的成员(变量和方法)语法上只能在本类中进行访问,但是也有例外,如果使用的是反射技术,可以通过setAccessible(true)进行暴力访问。Java反射异常java.lang.IllegalAccessException
这样就可以访问属性了

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