反射类的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控制下????
...全文
196 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zl3450341 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没有设置?同步?其他线程读写中????有没有办法预测,避免?

这就是我想了解的。

62,614

社区成员

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

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