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

黑马程序员——高新技术——反射(下半部分)

2015-09-19 14:35 381 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
<23>对接收数组参数的成员方法进行反射
用反射方式执行某个类中的main方法

目标:

写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法。

用普通方式调用完后,大家要明白为什么要用反射方式去调用啊?因为在写程序时不知道到底要执行哪个类。所以让执行哪个类执行哪个类。



问题:

启动java程序的main方法的参数是一个字符串数组,即public static void main(String[] args),通过反射方式来调用这个main方法时,如何为invoke方法传递参数呢?按照jdk1.5的语法,整个数组是一个参数,而按jdk1.4的语法,数组中的每个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,javac到底会按照哪种语法进行处理呢?jdk1.5肯定要兼容jdk1.4的语法,会按jdk1.4的语法进行处理,即把数组打散成为若干个单独的参数。所以,在给main方法传递参数时,不能使用代码mainMethod.invoke(null,newString[]{“xxx”}),javac只会把它当做jdk1.4的语法进行理解,而不把它当做jdk1.5的语法解释,因此会出现参数类型不对的问题。

解决办法:

mainMethod.invoke(null,new Object[]{newString[]{“xxx”}});

mainMethod.invoke(null, (Object)newString[]{“xxx”});,编译器会作特殊处理,编译时不会把参数当做数组看待,也就不会将数组打散成若干个参数了。

例:

我给你的数组,你不会当作参数,而是把其中的内容当作参数

Classclass=Class.forName(arg[0]);

MethodmMain=class.getMethod(“main”,String[].class);

mMain.invoke(null,newObject[]{new String[]{“aaa”,“bbb”}});

mMain.invoke(null,(Object)newString[]{“aaa”, “bbb”});

<24>数组与Object的关系及其反射类型
数组的反射 数组也是一种类型:每一个数组都属于同一个Class的前提是首先要具有相同的元素类型,具有同一个维度。

具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。

代表数组的Class实例对象的getSuperclass()方法返回的父类为Object类对应的Class。

基本类型的一维数组可以被当做Object类型使用,不能当做Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。



Arrays.asList()方法处理int[]和String[]时的差异。

Array工具类用于完成对数组的反射操作。

思考题:怎么得到数组中的元素类型?

<25>数组的反射应用
思考题:怎么得到数组中的元素类型?没有办法得出数组元素类型,只能得到每个具体的元素的类型。需要取出每个元素对象,然后再对各个对象进行判断,因为其中每个具体元素的类型都可以不用,例如Object[] x=newObject[]{“abc”,Integer.MAX_VALUE}






<26>ArrayList_HashSet的比较及HashCode分析
(面试题)HashCode方法的作用:假设集合存放了一万个元素,你想判断这里面有没有相同的,普通方法就要依次取,依次找,耗费时间。HashCode算法就是将集合分成若干个区域,每一个要存进来的对象要算出来一个值,根据算出来的值就去相应的区域查找(equals方法),只要在相应区域查找就好了。但首先存储集合要是Hash集合。如果只写equals不写HashCode,就会导致相同元素在不同区域,就会无法判断两个元素相同。为了将相同对象肯定放在相同区域,就需要使用HashCode。



(面试题)当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值得字段了,否则,对象修改后的哈希值与最初存储仅HashSet集合中的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄漏(内存不用了,但没有被释放,日积月累用光了)。

<27>框架的概念及用反射技术开发框架的原理
反射的作用à实现框架功能

框架与框架要解决的核心问题

我做房子卖给用户住,由用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我提供的框架中。框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类。

框架要解决的核心问题

我在写框架(房子)时,你这个用户可能还在上小学,还不会写程序呢,我写的框架程序怎样调用到你以后写的类(门窗) 呢?

因为在写程序时无法知道要被调用的类名,所以,在程序中无法直接new某个类的实例对象,而要用反射的方式来做。









综合案例

先直接用new语句创建ArrayList和HashSet的实例对象,演示用eclipse自动生成ReflectPoint类的equals和HashCode方法,比较两个集合的运行结果差异。

然后改为采用配置文件加反射的方式创建ArrayList和HashSet的实例对象,比较观察运行结果差异。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: