序列化/反序化
方便读写java中的任何对象(该对象需要实现
Serializable
)若没有继承
Serializable
,写出时会抛出异常,java.io.NotSerializableException 没有实现序列化接口实现
Serializable
接口后,通常要指定版本号(不指定时自动生成)反序列化的对像与当前版本一致 那么反序列化必定成功,哪怕类结构发生改变,凡是可用属性还是会还原
版本号不同时反序列化必定失败
transient
关键字修饰的变量和静态变量不会写出继承父类成员变量时,父类需要实现
Serializable
接口才能还原数据- 引用变量必须实现
Serializable
接口否则会抛出异常,null时除外
利用反射完成加密和解密
try {
String str="111";
Class kgc =KeyGenerator.class;
Method kgcm=kgc.getMethod("getInstance", String.class);
Object kg=kgcm.invoke(kgc, "Desede");
Method m= kgc.getMethod("generateKey"); //获取生成秘钥方法
Object key=m.invoke(kg); //获取秘钥
System.out.println("密钥获取成功");
Class cc=Cipher.class;
m=cc.getMethod("getInstance",String.class);
Object c=m.invoke(cc,"Desede"); //锁实例
System.out.println("锁获取成功");
m=cc.getMethod("init",int.class,Key.class);
m.invoke(c,cc.getField("ENCRYPT_MODE").get(cc),key); //初始化锁
System.out.println("锁初始化成功");
Class soc=SealedObject.class;
Object so=soc.getConstructor(Serializable.class,cc).newInstance(str,c); //获取上的盒子
System.out.println("获取盒子成功");
Class oosc=ObjectOutputStream.class;
Class fosc=FileOutputStream.class;
Object fos=fosc.getConstructor(String.class).newInstance("str.data"); //获取字节流
Object oos=oosc.getDeclaredConstructor(OutputStream.class).newInstance(fos);
oosc.getMethod("writeObject", Object.class).invoke(oos, so);
System.out.println("成功写出");
Class oisc=ObjectInputStream.class;
Class fisc=FileInputStream.class;
Object fis=fisc.getConstructor(String.class).newInstance("str.data");
Object ois=oisc.getConstructor(InputStream.class).newInstance(fis);
Object sor=oisc.getMethod("readObject").invoke(ois);
System.out.println("成功获取盒子");
Object ostr=soc.getMethod("getObject",Key.class).invoke(sor, key);
System.out.println(ostr);
} catch (Exception e) {
e.printStackTrace();
}