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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 我的最优解 中级黑马   /  2015-6-19 23:39  /  203 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1.反射机制

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

2.反射机制如何实现

Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。

也就是说,ClassLoader找到了需要调用的类时,就会加载它,然后根据.class文件内记载的类信息来产生一个与该类相联系的独一无二的Class对象。该Class对象记载了该类的字段,方法等等信息。以后jvm要产生该类的实例,就是根据内存中存在的该Class类所记载的信息来进行。

Class对象都是jvm产生的。不,而且,更伟大的是,基于这个基础,java实现了反射机制。

获取Class对象有三种方式:

1.通过Object类的getClass()方法。例如:
Class c1 = new String("").getClass();
2.通过Class类的静态方法——forName()来实现:
Class c2 = Class.forName("Object");
3.如果T是一个已定义的类型的话,在java中,它的.class文件名:T.class就代表了与其匹配的Class对象,例如:
Class c3 = Manager.class;
Class c4 = int.class;
Class c5 = String.class;

这里需要解释一下3:请记住一句话,java中,一切皆对象。也就是说,基本类型int float 等也会在jvm的内存池像其他类型一样中生成
一个Class对象。而数组等组合型数据类型也是会生成一个Class对象的,而且更令人惊讶的是,java中数组的本来面目其实就是某个类,惊讶
中的惊讶是,含有相同元素的相同维数的数组还会共同享用同一个Class对象!其实根据我的臆想,数组的length性质应该就保存在这个Class
对象里面。

Class类中存在以下几个重要的方法:

  getName()
一个Class对象描述了一个特定类的特定属性,而这个方法就是返回String形式的该类的简要描述。由于历史原因,对数组的Class对象。

  newInstance()
该方法可以根据某个Class对象产生其对应类的实例。需要强调的是,它调用的是此类的默认构造方法。例如:
MyObject x = new MyObject();
MyObject y = x.getClass().newInstance();

  getClassLoader()
返回该Class对象对应的类的类加载器。

  getComponentType()
该方法针对数组对象的Class对象,可以得到该数组的组成元素所对应对象的Class对象。例如:
int[] ints = new int[]{1,2,3};
Class class1 = ints.getClass();
Class class2 = class1.getComponentType();
而这里得到的class2对象所对应的就应该是int这个基本类型的Class对象。

  getSuperClass()
返回某子类所对应的直接父类所对应的Class对象。
   isArray()
判定此Class对象所对应的是否是一个数组对象。
获得构造函数的方法 :
Constructor getConstructor(Class[] params)
根据指定参数获得public构造器
Constructor[] getConstructors()
获得public的所有构造器
Constructor getDeclaredConstructor(Class[] params)
根据指定参数获得public和非public的构造器
Constructor[] getDeclaredConstructors()
获得public的所有构造器 
    获得类方法的方法 
Method getMethod(String name, Class[] params)
根据方法名,参数类型获得方法
Method[] getMethods()
获得所有的public方法
Method getDeclaredMethod(String name, Class[] params)
根据方法名和参数类型,获得public和非public的方法
Method[] getDeclaredMethods()
获得所以的public和非public方法 
    获得类中属性的方法 
Field getField(String name)
根据变量名得到相应的public变量
Field[] getFields()
获得类中所以public的方法
Field getDeclaredField(String name)
根据方法名获得public和非public变量
Field[] getDeclaredFields()
获得类中所有的public和非public方法 

0 个回复

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