=========== ASP.Net+Android+IOS开发、.Net培训、期待与您交流!===========

  Java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值。一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,但是他们都有一些同样的属性,比如类的名字,类的访问属性,类所属于的包名,字段名称的列表、方法名称的列表,等等,内存中的一个个类可分别用一个个的对象来表示,这些对象显然具有相同的类型,也可以视为一个Java类,这个类的名字就是Class。

  反射就是把Class对象中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Contructor、Package等。

  获取字节码文件的对象方式:

  •   Object getClass();在反射技术里该方法不合适,因为反射技术不明确具体类。
  •   所有的数据类型都有自己对应的Class对象,每一个数据类型都有一个默认的静态的属性.class,用该属性就可以获取到字节码文件对象。这种方式虽然不用对象调用了,还是要用具体的类调用静态属性。
  •   Class类中的静态forName方法,通过名称就可以获取对应的字节码文件对象。

  

  一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象,操作这些实例对象可以“反编译”.class文件。

  Constructor类:

  Constructor类对象代表某个类中的一个构造方法,得到某个类所有的构造方法:Constructor [] constructors= Class.forName("java.lang.String").getConstructors();得到某一个构造方法: Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);得到了构造函数,我们就可以new出我们的对象了,平常我们创建实例对象:String str = new String(new StringBuffer("abc"));在反射方式创建对象String str = (String)constructor.newInstance(new StringBuffer("abc"));

  

  当类中可以通过空参数的构造方法创建对象时,可以直接透过Class类对象new出对象(底层还是调用了getConstructors();),例:String obj = (String)Class.forName("java.lang.String").newInstance();

  Field类:

  Field类代表某个类中的一个成员变量,通过getField();方法可以得到的Field对象,这里得到的Field对象是对应到类上面的成员变量,而不是对应到某个具体对象上的成员变量,类只有一个,而该类的实例对象有无数个,要获得具体对象上某个成员变量的值,需要将对象作为参数传入Field对象的get()方法。

  Method类:

  Method类代表某个类中的一个成员方法,Method charAt = Class.forName("java.lang.String").getMethod("charAt", int.class);通常方式调用一个对象的形式为:对象.方法名(参数),用反射方式调用方法表现为invoke方法。例:charAt.invoke(str, 1)

  数组的反射:具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。Array工具类用于完成对数组的反射操作。

  反射的作用:在编写程序时,有时候无法知道被调用的类名,也就无法当作工具类来用,无法new某个类的实例,可以用反射技术可以来实现。把需要的调用的类名保存在配置文件中,用户在用我们编写的程序只要修改配置文件即可。

  

-----------☆-----------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! -----------☆-----------

详细请查看: http://edu.csdn.net

黑马程序员:Java编程_反射技术的更多相关文章

  1. 黑马程序员——JAVA基础之反射

      ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! -------     Java 反射是Java语言的一个很重要的特征,它使得Java具体了"动态 ...

  2. 【黑马18期Java毕业生】黑马程序员Java全套资料+视频+工具

        Java学习路线图引言:        黑马程序员:深知广大爱好Java的人学习是多么困难,没视频没资源,上网花钱还老被骗. 为此我们历时一个月整理这套Java学习路线图,不管你是不懂电脑的小 ...

  3. [刘阳Java]_程序员Java编程进阶的5个注意点,别编程两三年还是增删改查

    此文章也是关注网上好几篇技术文章后,今天分享出来.因为,总有在程序学习路上的小伙伴会感到迷茫.而迷茫存在的情况如下 第一种:在大学学习中出现的迷茫,不知道Java到底要学什么.学习Java的标准是什么 ...

  4. 黑马程序员Java基础班+就业班课程笔记全发布(持续更新)

    正在黑马学习,整理了一些课程知识点和比较重要的内容分享给大家,也是给自己拓宽一些视野,仅供大家交流学习,大家有什么更好的内容可以发给我 ,现有黑马教程2000G  QQ 1481135711 这是我总 ...

  5. 黑马程序员——JAVA基础之语法、命名规则

    ------- android培训.java培训.期待与您交流! ---------- 1.java语言组成:关键字,标识符,注释,常量和变量,运算符,语句,函数,数组. 2.java关键字:被Jav ...

  6. 黑马程序员_Java基础:反射机制(Reflection)总结

    ------- android培训.java培训.期待与您交流! ---------- 反射在java中有非常重大的意义,它是一种动态的相关机制,可以于运行时加载.探知.使用编译期间完全未知的clas ...

  7. 黑马程序员----java基础笔记中(毕向东)

    <p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...

  8. 黑马程序员——JAVA基础之泛型和通配符

    ------- android培训.java培训.期待与您交流! ---------- 泛型:            JDK1.5版本以后出现新特性.用于解决安全问题,是一个类型安全机制. 泛型好处: ...

  9. 黑马程序员——JAVA基础之简述面向对象,类,变量,匿名对象

    ------- android培训.java培训.期待与您交流! ---------- 面向对象: 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程 强调的是功能行为 面向对象 将 ...

随机推荐

  1. 安装DotNetCore.1.0.0-VS2015Tools.Preview2失败解决方案

    1.把安装文件放入非系统盘 2.命令行带参数运行: DotNetCore.1.0.0-VS2015Tools.Preview2.0.1.exe SKIP_VSU_CHECK=1 或 DotNetCor ...

  2. jq 移除包含某个字符串的类名js

    el.removeClass (function (index, css) { return (css.match (/(^|\s)star\S+/g) || []).join(' ');//移除以“ ...

  3. 用友华表Cell一些用法小结(cs.net版本)

    //从Color类型得到RGB类型,也可以用ColorTranslator.ToOle()方法 public int GetRGBFromColor(Color color) { byte r = c ...

  4. Mac下安装Wireshark,双击闪退

     Mac OS X上使用Wireshark抓包(http://blog.csdn.net/phunxm/article/details/38590561) Mac下安装Wireshark /Appli ...

  5. spring,maven,dubbo配置

    首先我写的这个不是介绍原理的东西,只是指明在我在使用的过程中遇见的一些疑惑的,最后我的理解,你要看详细的配置的话可以看网上的,这个一大堆的.其实dubbo的原理从模型上来看是很简单的东西,完全可以把这 ...

  6. MySQL drop、delete和truncate的区别

    注意:这里说的delete是指不带where子句的delete语句 相同点 truncate和不带where子句的delete, 以及drop都会删除表内的数据 不同点: 1. truncate和 d ...

  7. at

    1.这个命令对于自己建立的虚拟机很有帮助,比如你想过半个小时关机: [root@oc3408554812 ~]# at now + 30 minutesat> cd /tmp -h nowat& ...

  8. iOS开发UI篇—Quartz2D(自定义UIImageView控件)

    iOS开发UI篇—Quartz2D(自定义UIImageView控件) 一.实现思路 Quartz2D最大的用途在于自定义View(自定义UI控件),当系统的View不能满足我们使用需求的时候,自定义 ...

  9. iOS开发多线程篇—自定义NSOperation

    iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...

  10. vs2008编译openssl问题

    运行openssl demo 时,debug 版本正常,release 版本报异常:OPENSSL_Uplink(585E6000,08): no OPENSSL_Applink .demo 编译环境 ...