您的位置:首页 > 职场人生

黑马程序员_反射的应用

2015-11-02 03:08 369 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一、反射技术在开发框架原理上的应用:

其实我刚学完反射一直有个疑惑,反射到底有什么用?已经有这个类了,为什么那么麻烦,通过反射去获取类的变量、方法等?

这个疑问一直伴随着我学完反射这个知识,直到张孝祥老师讲的一个例子让我,感觉好像明白了一点。

先讲一个通俗的例子,开发商建一栋楼,但是他是不会帮我们选择安装什么有的门、窗等,它只能给我们预留一些空间。这里的毛坯房相当于框架,门窗相当于我们写的类,框架要调用类。开发商在建房子的时候还不知道,某一房子将会是谁买的,所以建房子时(写框架时)不知道要调用的类名,这样就不能new某一个类的示例化对象了,这时反射就派上用场了。程序先在配置文件中给这些类取一个名字,当用户写好类后,修改配置文件即可,不应再修改代码即可,程序只需要读取配置文件里的类名就可以调用类的内容。

代码示例:

<span style="font-size:18px;">InputStream ins new FileInputStream("cofig.properties");//用流读取配置文件
Properties props = new Properties ();  //创建Properties对象
props.loads(ins);//加载配置文件
ins.close(); //关闭流资源
String className = Props.getProperty("className");//获取类的名字
Collection collection = (Collection) class.forName(className).newInstance();</span>


二、数组反射的应用

具有相同维度和元素类型的数组属于同一个类型,也就是具有相同的class实例对象。
代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。
基本类型的一维数组可以被单做Object类型使用,不能当做Object[]类型使用,非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]使用。
示例代码:通过反射打印数组

//打印Object类的方法,Object是任意类型的父类,所以可以是数组Array
public void printObject(Object obj){//接收一个Object或Object的子类

Class c = obj.getClass();  //获取传进来的对象Obj的字节码文件
if(c.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);//不是数组直接打印
}
}


三、反射的综合案例:HashCode的分析

当一个对象被存进HashSet集合后就不要修改这个对象中那么参与计算hashcode的字段了,否则修改后的哈希值与最初存进HashSet中的哈希值就不同了。这样会引起不好的问题:

1、这样,即使在contains方法使用该对象的当前引用作为参数去HashSet中找对象,也会返回找不到的结果。

2、这样也会导致无法从HashSet集合中单独删除这个哈希值变化后的对象,从而可能导致内存溢出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: