Java反射异常java.lang.IllegalAccessException
程序员文章站
2022-05-04 08:50:10
抽取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;
}
这里出现的异常
解决:
出现了IllegalAccessException异常,看了一下抛出的异常信息后,查看了反射的那个类中构造方法被private权限修饰符修饰了
private修饰的成员(变量和方法)语法上只能在本类中进行访问,但是也有例外,如果使用的是反射技术,可以通过setAccessible(true)进行暴力访问。
这样就可以访问属性了
本文地址:https://blog.csdn.net/newHollow/article/details/107670665