框架的概念及用反射技术开发框架的原理
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()); } }