反射类的IllegalAccessExceptionextends如何发生??

smartcatiboy 2009-11-25 08:52:20
以下是我写的从文件读取类数据的类,这里只处理long和String。
public class CStorable {

public void loadFromFile(RandomAccessFile raf) throws IOException{
Class clsThis=this.getClass();
Field afldThis[]=clsThis.getDeclaredFields();
Field.setAccessible(afldThis,true);
for (int i=0;i<afldThis.length;i++){
Class clsType=afldThis[i].getType();
try {
if (clsType==Long.TYPE){
afldThis[i].set(this,raf.readLong());
}else if (clsType==String.class){
int intLength=raf.readInt();
byte abytString[]=new byte[intLength];
raf.read(abytString);
afldThis[i].set(this,new String(abytString,"utf-8"));
}

}catch (IllegalArgumentException e){
}catch (IllegalAccessException e) {
}
}
}

public void saveToFile(RandomAccessFile raf) throws IOException{
Class clsThis=this.getClass();
Field afldThis[]=clsThis.getDeclaredFields();
Field.setAccessible(afldThis,true);
for (int i=0;i<afldThis.length;i++){
Class clsType=afldThis[i].getType();
try {
if (clsType==Long.TYPE){
raf.writeLong(afldThis[i].getLong(this));
}else if (clsType==String.class){
String strData=(String) afldThis[i].get(this);
byte abytString[]=strData.getBytes("utf-8");
int intLength=abytString.length;
raf.writeInt(intLength);
raf.write(abytString);
}
}catch (IllegalArgumentException e){
}catch (IllegalAccessException e) {
}
}
}
}


对于IllegalArgumentException只对于数组而言,这里不会发生;
我已经设置了Field.setAccessible(true),IllegalAccessException还会发生吗?在什么状态下发生呢???
因为Exception会被忽略掉,如果不能确保读写的数据同步就会发生错误。

========
SDK如是说IllegalAccessException当应用程序试图反射性地创建一个实例(而不是数组)、设置或获取一个字段,或者调用一个方法,但当前正在执行的方法无法访问指定类、字段、方法或构造方法的定义时,抛出 IllegalAccessException。

这里的"无法访问"具体是指什么呢??是否都在Field.setAccessible控制下????
...全文
237 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
老张-AI 2009-11-27
  • 打赏
  • 举报
回复
public class IllegalArgumentException
extends RuntimeException
抛出的异常表明向方法传递了一个不合法或不正确的参数。


楼主每次问的问题都很好啊
mark 学习
晴天1999 2009-11-27
  • 打赏
  • 举报
回复
新手哈!多多指教哟!
qibao33 2009-11-27
  • 打赏
  • 举报
回复
帮顶
smartcatiboy 2009-11-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yetaodiao 的回复:]
smartcatiboy 祝福
[/Quote]

我初学,问的问题可能就是错的,请帮忙指点一下,给个方向就非常感谢了
  • 打赏
  • 举报
回复
smartcatiboy 祝福
999朵玫瑰 2009-11-26
  • 打赏
  • 举报
回复
RandomAccessFile
godismydaughter 2009-11-26
  • 打赏
  • 举报
回复
顶上去,我也不懂。
crazylaa 2009-11-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 smartcatiboy 的回复:]
如果我问的问题很傻比,请直接指出来。

不懂问错了不丢人
[/Quote]

支持一下。我也不懂。
smartcatiboy 2009-11-26
  • 打赏
  • 举报
回复
如果我问的问题很傻比,请直接指出来。

不懂问错了不丢人
smartcatiboy 2009-11-25
  • 打赏
  • 举报
回复
看了一遍,发现没说清楚,我的意思是:

这段程序的目的是创建一个可以从RandomAccessFile装入/保存自身数据的基类。它可以比Serializable更快,消耗更小,并且能随机读写。(这里为简化只保存long和String)

它会抛出3种异常,可能导致程序逻辑错误。

1、其中IOException是无法解决的,只要发生必定出错,于是上抛。
2、而IllegalArgumentException只是对于设置读写数组时可能发生,由于这里只处理long和String,所以也不用考虑
3、关键是IllegalAccessException。问题就出在这里,我不知道它具体是怎么回事。如果这个异常无法预测,那么可能出现loadFromFile和writeToFile不对称的问题(比方write时属性Field("varA").get(Object)异常,程序忽略了,而读时Field("varA").set(Object,anyValue)没有异常,顺序读出
于没有其他检查和同步机制,这将导致数据读出的错误(而且用户不知道!)。

所以我必须知道IllegalAccessException确切在什么时侯才会发生。

在SDK中如是解释:“当应用程序试图反射性地创建一个实例(而不是数组)、设置或获取一个字段,或者调用一个方法,但当前正在执行的方法无法访问指定类、字段、方法或构造方法的定义时,抛出 IllegalAccessException。 ”

这里并没有确切说明"正在执行的方法无法访问指定类、字段、方法或构造方法的定义时"到底是什么造成的,是setAccessible没有设置?同步?其他线程读写中????有没有办法预测,避免?

这就是我想了解的。
内容概要:本文介绍了一种基于双层优化的微电网系统规划设计方法,旨在通过Matlab代码实现,解决微电网在规划与运行中的多目标、多层次决策问题。该方法将优化过程分为上下两层:上层通常负责容量配置、设备选址等长期规划决策,下层则聚焦于能量管理、出力调度等短期运行优化,通过迭代交互实现全局最优。文中详细阐述了模型构建、约束条件设定、目标函数设计及求解算法实现流程,并提供了完整的Matlab代码供复现实验,有助于深入理解微电网系统的设计逻辑与优化机制。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事新能源、微电网、综合能源系统等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 学习和掌握双层优化理论在微电网规划设计中的具体应用;② 通过阅读和运行Matlab代码,复现并改进经典优化模型,用于学位论文、科研项目或实际工程方案设计;③ 深入理解微电网中分布式能源、储能与负荷的协同优化调度策略。; 阅读建议:此资源以Matlab代码实现为核心,强调理论与实践的结合。建议读者先理解双层优化的基本思想和数学模型,再结合代码逐行分析,重点关注变量定义、约束条件的代码转化以及主从问题间的迭代逻辑。鼓励在提供的代码基础上进行参数调整、场景扩展或算法改进,以深化学习效果。

62,622

社区成员

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

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