黑马程序员——高新技术——反射(下半部分)
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的实例对象,比较观察运行结果差异。
<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的实例对象,比较观察运行结果差异。
相关文章推荐
- 什么叫真正的程序员
- 黑马程序员-------OC----构造方法和description方法
- 黑马程序员-------OC----@property和@synthesize
- 程序员每天该做的事
- 黑马程序员——Java基础——面向对象的特征(二)
- 腾讯面试经历2015
- 黑马程序员_java基础_Map集合
- 进职场记(三)-求职
- 黑马程序员-------OC----点语法
- 一道google面试题
- 面试、笔试题记录
- 黑马程序员_编写程序,获取两个字符串中最大相同子串
- 黑马程序员-------OC----关联关系和依赖关系
- 【.Net码农】C#.net文件批量上传解决方案附下载(swfupload)2015-8-28更新
- 8个让程序员追悔莫及的职业建议
- 黑马程序员--NSString前后缀检查及搜索
- 黑马程序员--NSRange的使用
- 老程序员推荐的7个开发类工具
- 面试准备之css篇
- 黑马程序员——ios开发基础之OC中Foundation框架(二)、copy以及单例