大数据工程师:大数据的java基础 第十一周

Java中枚举类型都是继承自java.lang.Enum的,Enum也实现了Serializable接口
File file = new File("person.out");
ObjectOutputStream oout = new ObjectOutputStream(new FileOutputStream(file));
Person person = new Person("John", 101, Gender.MALE);
oout.writeObject(person);
oout.close();
ObjectInputStream oin = new ObjectInputStream(new FileInputStream(file));
Object newPerson = oin.readObject(); // 没有强制转换到Person类型
oin.close();


使用transient关键字 屏蔽不需要序列化的成员
transient private Integer age = null;

Singleon模式
在支持序列化的对象上添加一个
private Object readResolve() throws ObjectStreamException方法,使其始
终返回单例的对象即可

public class Person implements Serializable {

private static class InstanceHolder {
private static final Person instatnce = new Person("John", 31, Gender.MALE);
}
public static Person getInstance() {
return InstanceHolder.instatnce;
}
private Object readResolve() throws ObjectStreamException {
return InstanceHolder.instatnce;
}

}

反射(Reflection)能够让运行于JVM中的程序检测和修改运行时的行为
  内省用于在运行时检测某个对象的类型和其包含的属性
• 反射用于在运行时检测和修改某个对象的结构及其行为
• 内省是反射的子集
 运行时生成对象
//获取需要生成的对象的类
Class c=Class.forName("DynTest");
//获取需要调用的构造函数的参数的类
Class[] ptype=new Class[]{double.class,int.class};
//获取对应的构造函数
Constructor ctor=c.getConstructor(ptypr);
//生成构造函数所需的参数
Object[] obj=new Object[]{new Double(3.1415),new Integer(123)};
//生成对象
Object object=ctor.newInstance(obj);

 通过反射调用一个方法
– 首先创建一个Class数组,数组中的Class对象为所需要调用的方法的参数类型
– 通过getMethod(String nameClass[])获取Method对象,name为方法的名称
– 创建一个Object数组,数组中存放调用方法的参数值
– 调用Method.Invoke(Object objObject[])方法,obj为被调用方法的对象
 通过反射访问一个属性
– 调用ClassgetField()并指定field名称
– 调用Field.get(Object obj)Field.set(Object obj, Object value)方法获取
或设置Field的值

 非侵入式编程
– 自己使用Externalizable进行序列化,序列化和反序列化都依赖于现有代码,一旦代码发生变
动,序列化和反序列化的逻辑同样变动
– 使用默认的序列化机制则不需要变动序列化代码
– Junit采用反射,使得测试不再依赖于main方法
– Spring使用反射,使得代码可以通过配置文件改变行为
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值