1.properties:属性配置文件工具
properties props = new properties();
//加载xx.properties属性配置文件
prop.load(Test.class.getClassLoader().getResourceAsStream("xx.properties"));
//取配置参数
String value = props.getProperty("key");
2.动态代理
根据一个或者多个接口,用jdk的proxy框架构造出一个动态代理类的对象
那么这个动态代理对象上就具备哪些接口上的方法
只不过这些方法的具体逻辑是定义在InvocationHandler实现类的invoke()方法中
Object o = proxy.newProxyInstance(ReadData.class.getClassLoader(),new Class<?>[]{ReadData.class},new InvocationHandler(){
public Object invoke(Object proxy,Method method,Object[],args){
}
}};
o.findProductById(3);//该调用其实被动态代理机制拦截,执行的是invoke里面的逻辑
3.利用动态代理封装一个RPC框架
给客户端一个动态代理对象,客户就以为拿到了服务端的一个实现类的对象就愉快地调起了方法,他还以为真的在他的机器上调用到了这个方法,而本质上,他的调用行为被我们提供的动态代理对象上的invoke所拦截,在invoke中向远程服务器进行了通信交互,拿到结果再返回给用户。
4.线程安全问题
加一把线程锁:
synchronized(标记,eg.SellRunnable.class);