黑马程序员---JAVA反射机制 二

来源:互联网 发布:java外包 编辑:程序博客网 时间:2024/06/11 17:39

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

数组的反射
具有相同维数和元素类型的数组属于同一类型,即具有相同的Class实例对象
代表数组的Class实例对象的getSuperClass方法返回的父类为Object类对应的Class
基本类型的一维数组可以被当做Object类型使用不能当做Object[]类型使用
非基本类型的一维数组既可以当做Object类型使用也可以当做Object[]类型使用
Arrays.asList()方法处理int[]和String[]时的差异
Array工具类用于完成对数组的反射操作

int[]a1=new int[]{1,2,3};int[]a2=new int[4];int[][]a3=new int[2][3];String []a4=new String[]{"a","b","c"};            System.out.println(a1.getClass()==a2.getClass());//trueSystem.out.println(a1.getClass().getName());//[ISystem.out.println(a1.getClass().getSuperclass().getName());//java.lang.Object          System.out.println(a3.getClass().getName());//[[I           System.out.println(a3.getClass().getSuperclass().getName());//java.lang.ObjectObject obj1=a1;Object obj2=a4;//Object[] obj3=a1;//错Object[] obj4=a3;Object[] obj5=a4;       System.out.println(a1);//[I@139a55System.out.println(a4);//[Ljava.lang.String;@1db9742            System.out.println(Arrays.asList(a1));//[[I@139a55]         System.out.println(Arrays.asList(a4));//[a, b, c]

传过来一个Object类型的数据,把它打印出来
首先要判断这个Object是不是数组,然后分别打印
如果是数组就拆包,如果不是就直接打印

class TestArgument{    public static void main(String[] args) {        String []a1=new String[]{"a","b","c"};        printObject(a1);        printObject("xyz");    }    private static void printObject(Object obj) {        Class clazz=obj.getClass();        if (clazz.isArray()) {            int len=Array.getLength(obj);            for(int i=0;i<len;i++){                System.out.println(Array.get(obj, i));            }        }else{            System.out.println(obj);        }    }}

反射的作用—实现框架功能
框架与框架要解决的核心问题
我盖房子给用户住,有用户自己负责安装门窗、空调、家具等,我做的房子就是框架,用户需要用我的框架,然后把门窗等放进框架中,框架与工具类的区别是工具类被用户类调用,而框架则是调用用户提供的类
框架要解决的核心问题
我在写框架(房子)时,你这个用户可能还在上小学,还不会写程序,我写的框架程序怎样调用到你以后写的类(门窗)呢?
因为写框架时不知道要被调用的类名,所以在程序中无法直接new某个类的实例对象,而要用反射来做
综合案例
先直接用new语句创建ArrayList和HashSet的实例对象,比较两个集合的运行结果差异
然后改为采用配置文件加反射的方式创建ArrayList和HashSet的实例对象
ArrayList是按顺序放对象的引用
HashSet是放对象是要比较对象的hash值

package reflect;public class ReflectPoint {    private int x;    public int y;    public String str1="ball";    public String str2="basketball";    public String str3="itcast";    public ReflectPoint(int x, int y) {        this.x = x;        this.y = y;    }    @Override    public int hashCode() {        final int prime = 31;        int result = 1;        result = prime * result + x;        result = prime * result + y;        return result;    }    @Override    public boolean equals(Object obj) {        if (this == obj)            return true;        if (obj == null)            return false;        if (getClass() != obj.getClass())            return false;        ReflectPoint other = (ReflectPoint) obj;        if (x != other.x)            return false;        if (y != other.y)            return false;        return true;    }    @Override    public String toString(){        return str1+":"+str2+":"+str3;    }}import java.util.ArrayList;import java.util.Collection;import java.util.HashSet;public class ReflectTest3 {    public static void main(String[] args) throws InterruptedException {//      Collection collections=new ArrayList();        Collection collections=new HashSet();        ReflectPoint pt1=new ReflectPoint(3, 3);        ReflectPoint pt2=new ReflectPoint(5, 5);        ReflectPoint pt3=new ReflectPoint(3, 3);        collections.add(pt1);        collections.add(pt2);        collections.add(pt3);        collections.add(pt1);        System.out.println(collections.size());    }}

下面写一个小框架
首先定义一个配置文件config.properties
className=java.util.ArrayList
然后

package reflect;import java.io.FileInputStream;import java.io.InputStream;import java.util.Collection;import java.util.Properties;public class ReflectTest2 {    public static void main(String[] args) throws Exception {        InputStream ips=new FileInputStream("config.properties");        Properties prop=new Properties();        prop.load(ips);        ips.close();        String className=prop.getProperty("className");        Collection collections=(Collection)Class.forName(className).newInstance();        ReflectPoint pt1=new ReflectPoint(3, 3);        ReflectPoint pt2=new ReflectPoint(5, 5);        ReflectPoint pt3=new ReflectPoint(3, 3);        collections.add(pt1);        collections.add(pt2);        collections.add(pt3);        collections.add(pt1);        System.out.println(collections.size());    }}

运行这个程序,只要把你写的类名写的配置文件里就好了,当
className=java.util.HashSet,结果为2,
当className=java.util.ArrayList,结果为4

0 0
原创粉丝点击