框架的概念及用反射技术开发框架的原理

package com.learning;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Properties;

public class ReflectTest2 {

/**
* @param args
* @throws IOException 
* @throws ClassNotFoundException 
* @throws IllegalAccessException 
* @throws InstantiationException 
*/
public static void main(String[] args) throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException {

//尽量面向父类或接口编程
InputStream ips = new FileInputStream("config.properties");
Properties props = new Properties();
props.load(ips);
ips.close();

//主要目的是在运行时得到用户编写的类的类名,然后就可以利用反射做了
String className = props.getProperty("className");
Collection collections = (Collection)Class.forName(className).newInstance();


// TODO Auto-generated method stub
//Collection collections = new ArrayList();
//print out size is 4
//Collection collections = new HashSet();
//print out size is 3
//因为后面加入的时候加了两个pt1,同一个对象相等,所以HashSet中只加了3个
ReflectPoint pt1 = new ReflectPoint(3,3);
ReflectPoint pt2 = new ReflectPoint(5,5);
ReflectPoint pt3 = new ReflectPoint(3,3);
//如果你希望pt1和pt3相等,那么自己必须重写equals方法
//默认的equals是比较两个对象的HashCode的值,HashCode的值一般是根据
//内存地址计算出来的
//在ReflectPoint中右键点击source,产出HashCode和equals方法
//这时候再打印,发现值为2,因为覆盖equals和HashCode方法之后,他们的equals方法相等
//System.out.println(pt1==pt3); //false
//System.out.println(pt1.equals(pt3)); //true
//HashCode的作用!
//在没有重写HashCode方法的时候pt1和pt3不相等。
//原因是因为pt1根据内存计算出一个Hash值,pt3也根据自己的内存地址
//计算出一个值,他们被存放到不同的区域
//当去取值的时候,我只在我自己的区域找,虽然在另一个区域存放着一个和
//我相同的对象,但是不在那个区域里面找。
//所以有个概念提出,如果两个对象的equals方法相等,那么让他们的HashCode也相等。

//如果一个对象被存放到一个HashSet集合中去,那么以后就不要去修改参与计算Hash值的字段了
//否则,对象修改后的哈希值与最初存储进HashSet集合的哈希值就不同了,这这种情况下,即使在
//contains方法使用该对象当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象
//的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露(不用的对象但
//没有释放)


collections.add(pt1);
collections.add(pt2);
collections.add(pt3);
collections.add(pt1);

//如果修改了存在HashSet集合中的值
pt1.y = 7;
collections.remove(pt1);
//print out size is still 2
//如果没有改的话那remove过后是1

System.out.println(collections.size());
}

}

  

posted @ 2013-09-16 14:47  Zhentiw  阅读(158)  评论(0编辑  收藏  举报