黑马程序员技术交流社区

标题: 浅谈java反射机制 [打印本页]

作者: 郭帅帅    时间: 2014-4-28 17:46
标题: 浅谈java反射机制
反射:

说反射之前,先要明确一下Class的含义;

java程序中的各个java类,他们属于同一类事物,那么可以用面向对象的思想类分析这类事物。把它们也看成一个类,那么这个类的名字就是Class;(注意:C是大写!)
这个Class类描述的是类的信息:包括类的名字,类的访问属性,类所属于的包名,字段名称的列表,方法名称的列表,等等
比如:Person类代表人,他的实例对象就是张三,李四这样一个个具体的人;

在java中Class类代表java类,它的各个实例对象又分别对应各个类在内存中的字节码,例如:
Person类的字节码,ArrayList类的字节码等等;
一个类被类加载器加载到内存中,占用一片储存空间,这个空间里面的内容就是类的字节码,
不同类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型,就是CLass类型;

得到各个字节码对应的实例对象三种方法:(Class类型)

1,类名.class , 例如:System.class
2,对象.getClass(),例如:new Date().getClass()
3,Class.forName("类名"),例如,Class.forName("java.util.Date");
注意:第三种比较常用,实际开发中,有些类是后期临时传入的;

九种类型的Class预定义对象;
boolean,byte,char,short,int,long,float,double
void也是,例如void.class

数组类型的Class实例对象:
Class.isArray() 判断不是不数组

总之,只要在源程序中出现的类型,都有各自的Class实例对象;

Java的反射机制主要由以下类来实现,(除了Class类)这些类都位于java.lang.reflect包中:
Class类:代表一个类。
Field 类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor 类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。

Class类是Reflection API 中的核心类,它有以下方法,获取成员变量、成员方法、接口、超类、构造方法等
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。


有人说:反射就是把java类中的各种成分映射成相应的java类,无疑,这句话实在太贴切了。
一个java类中用一个Class类的对象来表示一个类中的组成部分;
成员变量,方法,构造方法,包等等信息也用一个个的java类来表示,假如汽车是一个类,
汽车中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供一系列的方法,
来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示。

一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,
通过调用Class类的方法,可以得到这些实例对象。

反射机制的优点与缺点 :

为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念。

静态编译:在编译时确定类型,绑定对象,即通过。   

动态编译:运行时确定类型,绑定对象。

动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。

一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中      它的灵活性就表现的十分明显。但就是在运行时才动态的创建和编译,所以它对程序的性能是有影响的!

使用反射基本上是一种解释操作,有一种本末倒置的感觉。我们可以告诉JVM,我们希望做什么并且它满足我们的要求。然而这类操作总是慢于只直接执行相同的操作。

其实,反射就是一种解剖的过程,在解剖的过程中java面向对象思想的极致体现、通过解剖可以得出关于这个类的一切信息,然后根据这些信息做想做的事。在这个过程中无疑Class中的各种成分都可以归纳为一个个的对象。解剖出来的东西都用相应类的实例对象来表示。


作者: 孟凡超    时间: 2014-5-4 13:33
谢谢分享。。。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2