java中的简单反射

java 框架基础 

------------------- 
框架这个词算是 比较 贴切的,就像房子的骨架 
门和窗让用户自己安装,他们喜欢什么样式款式用户定 

★框架和工具类的区别: 
工具类被 用户写的类 调用 
框架是 调用 用户写的类 

那写大师们写框架时,我们可能还在上幼儿园, 
大师们也不会知道我们到时候会写出什么样的类来 

所以,框架里不可能说用 new来弄一些类的实例, 
只能让我们告诉框架 我们写的类叫什么,让框架反射吧! 

大师们也不知道我们写出的类会是怎么样的五花八门, 
所以,JAVABEAN规范 规定了我们 有默认的无参数构造函数啊. 
get set 方法啊.......等等
 

--------------------- 
用反射有很大的好处, 
对于用户,他们很可能没有javac ,有了也不会用, 
但是他们有notepad吧,修改XML properties文件可以吧..
 

-------------------- 
config.properties 
#className=java.util.ArrayList 
className=java.util.HashSet 

----------------------- 
Java代码     收藏代码
  1. package com.ncs;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.InputStream;  
  5. import java.util.ArrayList;  
  6. import java.util.Collection;  
  7. import java.util.Properties;  
  8.   
  9. public class ReadProperties {  
  10.     //介绍反射的好处  
  11.     //比方说我不写死,写一个 米你 框架,接受用户在配置文件里写的类  
  12.     //配置文件写在 工程目录底下,不是src下 和src兄弟级  
  13.     public static void main(String[] args) throws Exception {  
  14.         //load properties file  
  15.         InputStream is = new FileInputStream("config.properties");  
  16.           
  17.         //Properties在java.util.Properties;下,  
  18.         //这个类有个功能,可以把里面的 键值对 存到硬盘上  
  19.         //也可以把disk上的很多东西读进来  
  20.         Properties properties = new Properties();  
  21.         properties.load(is); //加载了  
  22.         is.close(); //好习惯  
  23.           
  24.           
  25.         String className = properties.getProperty("className");//良好的命名习惯  
  26.           
  27.         //Collection collection = new ArrayList(); 现在不用写死了  
  28.         Collection collection = (Collection)Class.forName(className).newInstance();  
  29.         String test = "hubin";  
  30.         collection.add(test);  
  31.         collection.add(test);  
  32.         collection.add(test);  
  33.           
  34.         System.out.println(collection.size()); //3 因为在培植文件里是ArrayList  
  35.         //System.out.println(collection.size()); //1 因为在培植文件里是java.util.HashSet  
  36.           
  37.     }  
  38. }  
  39. 017 配置文件的知识 

    刚刚已经说到 配置文件,我说放 工程下,和src 兄弟 
    这时的目录结构是 
    D:\enhance 
    │  .project 
    │  .classpath 
    │  ★config.properties 
     
    ├─src 
    │  └─com 
    │      └─ncs 
    │              Enum.java 
    │              Weekday.java 
    │              EnumDemo.java 
    │              EnumWithAbstractMethod.java 
    │              ReflectTest.java 
    │              Point.java 
    │              HasMainMethod.java 
    │              RunOtherClassMainMethod.java 
    │              ArrayReflct.java 
    │              ReflectInCollection.java 
    │              MyHashTest.java 
    │              ReadProperties.java 
     
    └─bin 
        └─com 
            └─ncs 
                    Enum.class 
                    Weekday.class 
                    Weekday$1.class 
                    Weekday$2.class 
                    EnumDemo.class 
                    EnumDemo$Month.class 
                    EnumWithAbstractMethod.class 
                    EnumWithAbstractMethod$TrafficLights.class 
                    EnumWithAbstractMethod$TrafficLights$3.class 
                    EnumWithAbstractMethod$TrafficLights$1.class 
                    EnumWithAbstractMethod$TrafficLights$2.class 
                    ReflectTest.class 
                    Point.class 
                    HasMainMethod.class 
                    RunOtherClassMainMethod.class 
                    ArrayReflct.class 
                    ReflectInCollection.class 
                    MyHashTest.class 
                    ReadProperties.class 

    我开发好了后,不可能把enhance整个目录给 客户,最多把bin目录打包给人家 
    ★那么把配置文件放哪里呢??????????? 

    我刚刚前一篇这样说过: 
    ------------------ 
    //介绍反射的好处 
    //比方说我不写死,写一个 米你 框架,接受用户在配置文件里写的类 
    //配置文件写在 工程目录底下,不是src下 和src兄弟级 
    public static void main(String[] args) throws Exception { 
    //load properties file 
    InputStream is = new FileInputStream("config.properties"); 
    ------------------ 
    ★其实不会这么做的 
    来看一下 
    C:\Documents and Settings\hubin>java MyClass xx.file 
    这里的xx.file 既不关系你的JAVA.EXE 也不关系你的MyClass这个类在哪里 
    而是和C:\Documents and Settings\hubin有关 

    然而你也可以到D盘去运行MyClass 
    这时又要在D盘下准备xx.file,显然不可行 
    如果写死 
    InputStream is = new FileInputStream("D:\\config.properties"); 
    也不对的. 

    怎么办????????? 
    1,可以写一个 配置文件,告诉JVM,我把配置文件放哪里了,就是描述配置文件在哪里的配置文件 

    2,用类加载器 
    我们平时用的*.class文件怎么进JVM的呢??? 
    既然 类加载器 可以把*.class文件从disk上加到JVM里 
    那么 加载 个配置文件也是顺手之劳了 
    具体看代码吧:: 
    ----------------------------------------------- 
    Java代码     收藏代码
    1. package com.ncs;  
    2.   
    3. import java.io.InputStream;  
    4. import java.util.Collection;  
    5. import java.util.Properties;  
    6.   
    7. public class ReadProperties {  
    8.     //介绍配置文件放哪里了  
    9.     public static void main(String[] args) throws Exception {  
    10.         //要run这个APP,ReadProperties肯定要进JVM吧  
    11.         //可以从这个类开刀,找到类加载器,然后 类加载器 在classpath下 一个个去找   
    12.         InputStream is =ReadProperties.class.getClassLoader().getResourceAsStream("com/ncs/config.properties");  
    13.         //注意没有 / 打头  
    14.         //现在好了,只是这方式不可以写,只读的,  
    15.           
    16.         //很多很多的框架的配置文件都用这种方式的,所以都不啊配置文件放classpath下的  
    17.           
    18.         //可以在ECLIPSE的src下放一个,IDE会自己给你创建一个在 bin下,最里面,写名字要写包名com/ncs/config.properties  
    19.         //不要自己去放,会被ECLIPSE删掉的,要在IDE里放  
    20.           
    21.         InputStream is2 = ReadProperties.class.getResourceAsStream("config.properties");  
    22.         //上面这行就更简单了,包名也可以不要了,ReadProperties 和 config.properties同名  
    23.           
    24.         //也可以加 /  加了就是说从 根开始找 一层一层包名要写全了  
    25.           
    26.         //把配置文件放中间会怎么样呢?  
    27.         //好象没有中间,都放src下,也就是直接在src下一层就有了[我的程序]  
    28.           
    29.         Properties properties = new Properties();  
    30.         properties.load(is);  
    31.         is.close();  
    32.           
    33.         String className = properties.getProperty("className");//良好的命名习惯  
    34.           
    35.         //Collection collection = new ArrayList(); 现在不用写死了  
    36.         Collection collection = (Collection)Class.forName(className).newInstance();  
    37.         String test = "hubin";  
    38.         collection.add(test);  
    39.         collection.add(test);  
    40.         collection.add(test);  
    41.           
    42.         System.out.println(collection.size()); //3 因为在培植文件里是ArrayList  
    43.         //System.out.println(collection.size()); //1 因为在培植文件里是java.util.HashSet  
    44.           
    45.     }  
    46. }  

 

你可能感兴趣的:(java中的简单反射)