以下是我写的从文件读取类数据的类,这里只处理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控制下????

解决方案 »

  1.   

    看了一遍,发现没说清楚,我的意思是:这段程序的目的是创建一个可以从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没有设置?同步?其他线程读写中????有没有办法预测,避免?这就是我想了解的。
      

  2.   

    public class IllegalArgumentException
    extends RuntimeException
    抛出的异常表明向方法传递了一个不合法或不正确的参数。 楼主每次问的问题都很好啊
     学习