黑马程序员 反射的各种应用

来源:互联网 发布:9.9包邮淘宝u站 编辑:程序博客网 时间:2024/06/13 06:53

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

这篇总结了反射的概念和应用

1、概念

我们知道类就是对事物的属性和行为的抽象,而一个类也是事物,于是我们用了
一个叫Class的类对所有类的各种信息进行了抽象,基本所有的类都有如下
信息:ConstrutorInfo(构造函数)、MethodInfo(方法)、FieldInfo(字段)PropertyInfo(属性)、

EventInfo(事件)、MemberInfo(成员)、ParameterInfo(参数)。
反射具有动态发现类型信息的能力,可以把类中所有信息都映射成一个个不同的类(class),通过
这些类对象,就可以访问并操作这些类的类型信息
  
当每个类被加载之后,系统就会为之生成一个对于的Class对象,也就是class(字节码:类的各种信息),
类的类型信息也是用一个个的类描述,也对应相应的class文件,
总之反射就是把Class中的参数信息映射成对应的类对象并进行操作

2、应用

1、获取类的Class对象
 1、使用Class类的静态方法forName(String name)   name为某个类的全限定类名
 2、调用某个类的class属性来获取该类的对应对象      String.class就是String的Class对象
 3、调用某个对象的getClass()方法   getClass()是Object类中的方法,因此所有类都继承了这个方法

2、Class中常用的方法

   getConstructor(Class<?>,...parameterTypes) 返回指定public的构造函数 parameterTyper为对应类型的字节码

   getDeclaredConstructor(Class<?>,...parametertyper) 获得与访问权限无关指定参数的构造函数

   Method getMethod(String 方法名,类型参数.class) 返回Class对象指定public 的方法

   Method getDeclaredMethod(String 方法名,类型参数.class) 返回Class对象指定的方法

   Field getField(String name) 返回Class对象指定的public field

   Field getDeclaredField(String name) 返回Class对象指定的field

3、通过Class对象创建对应类的对象
   1、使用Class对象的newInstance()创建该Class对象对应类的实例  

      注意:Class对象的newInstance方法中调用了默认构造方法
   2、使用Class对象获取指定的Constructor对象,在调用Constructor对象的newInstance创建该Class对象对应类
的实例

4、调用方法

   当获得类对应的Class对象之后,就可以通过该Class对象的getMethod或getMethods来获得指定方法对象或所有方法对象数组,在Method对象中的包含一个invoke(Object obj,Object...args) obj是调用方法的对象,后面是调用传入的实参

5、访问属性值

 通过Class对象的getField和getFields获取该类中对应的属性或全部属性,有如下两个方法操作属性

 1、getXxx(Object obj)获取obj对象的Field属性值,Xxx表示的是8种基本类型,引用类型省略Xxx

 2、setXxx(Object obj)同上

6、操作数组

在java.lang.reflect包下提供了一个Array类,Array对象可以代表所有的数组,程序可以通过下面方法创建并操作数组

1、static Object newInstance(Class<?>,int) 创建一个具有指定元素类型,指定长度的数组

2、static xxx getXxx(Object,index) 返回数组中下标为index的元素,Xxx为基本类型,引用类型就省略Xxx

3、static void setXxx(Object,index,xxx) 给数组指定下标项设置元素为xxx  引用也是省略Xxx

简单小运用:反射在泛型集合中的应用

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

0 0