反射反射,程序员的快乐.

第一次了解反射这个概念是从<<大话设计>>中所了解到的.当时只是对概念的模糊了解,具体对它的机制并不清楚.最近在学习并实践SSH框架,其中Spring框架中核心的内容是IOC(Inversion
of Control)控制反转,如果我们对java的反射机制有了一定的了解会对我们学习Spring框架有很大的帮助.接下来我们开始说说Java的反射机制.

什么是java反射?

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

上面是官方的说法,理解上稍微有点困难.接下来跟着笔者的思路来.

若想要理解java的反射,首先需要了解内容是Class类.我们都知道.在java的世界中一组对象可以抽象成为一个类,但是Java中的各种类应该用什么来表示呢?这就是Class类的作用.需要注意的是此Class非定义class类的小写class.Class类是对java各个类的抽象.

类一般都是有对象的,那Class类的对象具体是什么呢?

Class类的具体对象是各个类在内存中的字节码.每一个类被类加载器加载到内存中都会占据一定的空间,而这个空间里的内容就是字节码,不同的字节码类是不同的,而这些空间都可以用对象来表示.也就是Class上类的对象.

例如: ClassclsDate=Date.class   其中clsDate就是表示Date类在内存中的字节码.clsDate的类型是Class类型.上面是一种获取字节码对应的实例对象的一种方式,还有另外两种方式:

1  对象.getClass()    例如:new
Date().getClass()

2  Class.forName("类名") 例如:Class.forName("java.util.Date")

Class对象==类在内存中的空间的内容即字节码

通过Class类来获取Class对象

获取Class对象的三种方式:

1、   Class对象=对象.getClass()

2、 Class对象=Class.forName("类名")

3、 Class对象=类名.class

Class对象.newInstace() 可以获取该类的对象,但是是Object类型的,要强制类型转换

到此为止,我假定读者已经快要理解了Class类的概念,它跟反射有什么关系呢?

我们知道,一个java类中用一个Class类的对象来表示,一个类中的具体组成部分,例如成员变量,方法……等信息也可以用一个个的java类来表示.而作为java类的Class类理所应当的提供获取这些组成部分的方法,而这些信息就是需要用相应类的实例对象来表示,例如:Field,Method等等类的对象.这些内容官方称之为:Java反射API.

java.lang包下

Class<T>:表示一个正在运行的 Java 应用程序中的类和接口,是Reflection的起源

java.lang.reflect包下

Field 类:代表类的成员变量(也称类的属性)

Method类:代表类的方法

Constructor 类:代表类的构造方法

Array类:提供了动态创建数组,以及访问数组的元素的静态方法

例如:我们熟知的Date类,它有Date.getDate()方法,也有Date.getHours()方法,而每一个方法都是Method类的一个对象,如下:

Method   medDay=Date.getDate();

Method   medHour=Date.getHours();

通过上述方式我们获得了一个Method类的对象,这个对象表示的是一个java类(Date)的一个方法.

至此我们可以总结出,通过Class类我们可以操控java各种类的属性和方法,也就是说Class是反射的根基或起源.理解Class类是理解反射的第一步,在接下来的文章中我会通过一个实例来继续介绍java的反射机制.

java反射(1)的更多相关文章

  1. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  2. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  3. java反射(基础了解)

    package cn.itcast_01; /** *Person类 */ public class Person {    /** 姓名 */    private String name;     ...

  4. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  5. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  6. java反射学习之二万能EXCEL导出

    一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...

  7. java反射学习之一反射机制概述

    一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...

  8. java反射 之 反射基础

    一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...

  9. java反射 cglib asm相关资料

    有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...

  10. 超详细的java反射教程

    看技术博客时,看到关于java反射的博文,写的非常好.猛击下面的地址,开始java反射之旅 中文翻译地址:http://ifeve.com/java-reflection/ 英文原版地址:http:/ ...

随机推荐

  1. JAVA:ssm框架搭建

    文章来源:http://www.cnblogs.com/hello-tl/p/8328071.html 环境简介 : jdk1.7.0_25/jdk1.8.0_31  tomcat-7.0.81  m ...

  2. ThinkPHP foreach标签

    $optionvalue = array( 'MSGTYPE_TEXT'=>'文本消息', 'MSGTYPE_EVENT_SCAN'=>'扫描事件', 'MSGTYPE_EVENT_sub ...

  3. tornado框架基础09-cookie和session

    01 cookie 在上节,我们简单了解了登录过程,但是很明显,每次都需要登录,但是在平常逛网站的只需要登录一次,那么网站是如何记录登录信息的呢? 有没有什么办法可以让浏览器记住登录信息,下次再次打开 ...

  4. 分分钟钟学会Python - 函数(function)

    函数(function) 1 基本结构 本质:将多行代码拿到别处并起个名字,以后通过名字就可以找到这行代码并执行 应用场景: 代码重复执行 代码量很多超过一屏,可以选择通过函数进行代码的分割 写代码方 ...

  5. Java自动生成asmx的webservice代码

    第一种方式:针对CXF自动生成的代码对响应类大小写区别问题,可以使用此方法. 工具为Eclipse. 新建Web Service Client. 输入地址点击finish即可自动生成. 调用方式: p ...

  6. 计蒜客 Overlapping Rectangles (离散化)

    题意: 给定一个坐标系, 给出n个矩形的左下角坐标(bx,by)和右上角坐标(tx,ty) , 求矩形覆盖的面积, 有些区域会被多个矩形覆盖, 但只用算一次. n <= 1000,  0 < ...

  7. [数据结构]C#基于数组实现泛型顺序表

    前方预警,只完成了顺序表的插入/删除/查找. 错误代码示例: /// <summary> /// 查找顺序表第i个位置的元素 /// 在显示情况中,我们更常用下标 /// </sum ...

  8. _063_Android_Android内存泄露

    深入内存泄露 Android应用的内存泄露,其实就是java虚拟机的堆内存泄漏. 当然,当应用有ndk,jni时,没有及时free,本地堆也会出现内存泄漏. 本文只是针对JVM内存泄漏应用,进行阐述分 ...

  9. [luoguP2420] 让我们异或吧(dfs + 异或的性质)

    传送门 因为异或满足结合律和交换律. a^b^b=a 所以这个题直接求根节点到每个点路径上的异或值. 对于每组询问直接输出根到两个点的异或值的异或的值. ——代码 #include <cstdi ...

  10. WebApi下载附件文件

    WebApi下载附件文件 1. [RoutePrefix("down")] public class FilesController : ApiController { [GET( ...