黑马程序员_反射机制

来源:互联网 发布:女性必知的妇科小知识 编辑:程序博客网 时间:2024/06/06 01:56

------- android培训java培训、期待与您交流! ---------- 

            反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力。通过这种能力可以彻底的了解自身的情况为下一步的动作做准备。这种技术主要用于框架方面的应用。

           下面具体介绍一下java的反射机制。也许这里你将颠覆原来对java的理解。 Java的反射机制的实现要借助于4个类:Class,Constructor,Field,Method;其中class代表的是类对 象,Constructor是类的构造器对象,Field是类的属性对象,Method是类的方法对象。通过这四个对象涵括了一个类的各个组 成部分。

            Class:程序运行时,java运行时系统会对所有的对象进行运行时类型的处理。这项信息记录了每个对象所属的类,虚拟机通常使用运行时类型信息选择正 确的方法来执行。但是这些信息我们怎么得到啊,就要借助于Class类对象了啊。在Object类中定义了getClass()方法。我 们可以通过这个方法获得指定对象的类对象。然后我们通过分析这个对象就可以得到我们要的信息了。比如:ArrayList arrayList;

Class clazz = arrayList.getClass();

然后我来处理这个对象clazz。当然了Class类具有很多的方法,这里重点讲和Constructor,Field,Method类有关系的方法。

考虑下面这个简单的例子,让我们看看 reflection 是如何工作的。

import java.lang.reflect.*;

public class DumpMethods {

public static void main(String args[]) {

try {

    Class c = Class.forName(args[0]);

    Method m[] = c.getDeclaredMethods();

   ......

}

catch (Exception e) {

....

}

}

}

按如下语句执行:

java DumpMethods java.util.ArrayList

这个程序使用 Class.forName 载入指定的类,然后调用 getDeclaredMethods 来获取这个类中定义了的方法列表。java.lang.reflect.Methods 是用来描述某个类中单个方法的一个类。

 

Java类反射中的主要方法

对于以下三类组件中的任何一类来说 -- 构造函数、字段和方法 -- java.lang.Class 提供四种独立的反射调用,以不同的方式来获得信息。调用都遵循一种标准格式。以下是用于查找构造函数的一组反射调用:

Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数,

Constructor[] getConstructors() -- 获得类的所有公共构造函数

Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)

Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关)

获得字段信息的Class 反射调用不同于那些用于接入构造函数的调用,在参数类型数组中使用了字段名:

Field getField(String name) -- 获得命名的公共字段

Field[] getFields() -- 获得类的所有公共字段

Field getDeclaredField(String name) -- 获得类声明的命名的字段

Field[] getDeclaredFields() -- 获得类声明的所有字段

用于获得方法信息函数:

Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法

Method[] getMethods() -- 获得类的所有公共方法

Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得类声明的命名的方法

Method[] getDeclaredMethods() -- 获得类声明的所有方法

               掌握了以上的方法,我们基本上就能够熟练运用java的反射机制了。不要以为它是多么高深的技术。到最后还不是通过类的调用来完成功能的实现。