A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈兆辉 中级黑马   /  2014-9-23 10:41  /  790 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

反射
反射的基石--> Class类
Java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class。
Class类代表Java类,它的各个实例对象对应各类在内存中的字节码。
一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码。
只要是在源程序中出现的类型,都有各自的Class实例对象,例如,int[],void

如何得到各个字节码对应的实例对象(class类型)?
类名.class,例如,System.class
对象.getClass(),例如,new Date().getClass();
Class.forName("类名"),例如,Class.forName("java.util.Date");(反射主要使用这一种)

java有9个预定义Class实例对象:
int、byte、boolean、char、double、short、long、float、void;这九个类型都有包装类:
Integer、Byte、Boolean、Character、Double、Short、Long、Float、Void类中,
在这9个类中,都有一个静态字段TYPE,用来储存他们所包装的基本数据类型的字节码文件。


Class.isPrimitive()判断此字节码对象(Class)是否为预定义的9个Class对象之一。
例如:int.class.isPrimitive();(这句返回true)

概念:
反射就是把java类中的各个成分映射成相应的java类。
一个java类用一个Class类的对象来表示,而类中的组成部分:成员变量,方法,构造函数,
包等等信息则用一个个的java类来表示。表示java类的Class类提供了一系列的方法,来获得
其中的变量,方法,构造方法,包,修饰符等信息。这些信息就是用相应的实例对象来表示,
他们是Field、Contructor、Packeage等等。

Constructor类代表某个类中的一个构造方法
得到某个类所有的构造方法:
eg:Constructor constructors[] = Class.forName("java.lang.String").getConstructors();
得到一个构造方法:(根据参数列表区分类中的构造方法)
eg:Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
一个Constructor对象代表一个构造方法,其中的方法可以:得到名字,得到所属的类,产生实例对象。

创建实例对象:
通常方式:String str = new String(new StringBuffer("abc"));
反射方式:String str = (String)String.class.getConstructor(StringBuffer.class).newInstance(new StringBuffer("abc"));
Class.newInstance()方法:String Obj = (String)Class.forName("java.lang.String").newInstance();此方法内部先得到默认的
构造方法,然后用该方法创建实例对象。内部用到了缓存机制来保存默认的构造方法的实例对象。

Field类代表某个类中的一个成员变量,使用Field类的各种方法。

Method类代表某个类中的一个成员方法
例子:Method charAt = Class.forName("java.lang.String").getMethod("charAt",int.class);
调用方法:
通常方法:System.out.println(str.charAt(1));
反射方式:System.out.println(Class.forName("java.lang.String").getMethod("charAt",int.class).invoke(str,1));
注:如果传递给Method对象的invoke()方法的第一个参数为null,这意味着method对象对应的是一个静态方法。

数组的反射
具有相同维度和元素类型的数组属于同一个类型,即是相同的字节码文件创建的对象。
代表数组的Class实例对象的getSuperclass()方法返回的父类为Object类对应的Class.
基本类型的一维数组,父类为Object,可以被Object类型的引用指向,即Object aObj = new int[3];
但基本数据类型的一维数组不可以被Object[]的引用指向,即Object[] aObj = new int[3];是错误的
非基本数据类型的一位数组既可以被Object类型的引用指向,又可以被Object[]的引用指向。

Arrays.asList()方法处理int[]和String[]时的差异。
数组的反射:使用Array类的方法。

反射的作用->实现框架功能
何为框架:
打个比方:我做房子卖给用户住,由用户自己安装门窗,我做的房子就是框架,用户需要使用我的框架,
把门窗装进我提供的框架中。
与工具类不同,工具类是提供给用户调用的类,框架是调用用户提供的类。
框架与框架要解决的核心问题:
调用未知类名的类中的内容。只能通过反射的方式来做。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马