zoukankan      html  css  js  c++  java
  • 框架的概念及用反射技术开发框架的原理

    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());
    }
    
    }
    

      

  • 相关阅读:
    上传项目到github上
    app widget设置bitmap时,无作用
    Android Studio 启动app 白屏
    android sqlite 数据库中使用的类型
    android 解决华为系列手机调试时不能打印Logcat日志信息
    android 自定义滚动条图标
    检测邮箱
    js检测是否存在中文
    表单的checkbox选中和取消
    javascript
  • 原文地址:https://www.cnblogs.com/Answer1215/p/3324248.html
Copyright © 2011-2022 走看看