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

------ 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的实例对象,比较观察运行结果差异。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值