您的位置:首页 > 编程语言 > Java开发

反射机制

2015-08-11 18:38 267 查看
1.1 反射机制概述

Java的反射机制是Java特性之一,是构建框架技术的所在。所以在我们讲Struts2之前,让我们先来了解一下反射。灵活掌握Java的反射机制,对以后学习框架技术是大有帮助的。

Java反射机制是指在运行时,动态获取类或者对象的信息及动态调用对象的方法的功能。

Java反射具有3个动态性质:

A.运行时生成对象实例。

B.运行期间调用方法。

C.运行时更改属性。

如何理解Java反射的原理呢?反射是光学中的一个概念,在计算机领域是指程序可以访问、检测,修改它自身状态和行为的能力。我们举个例子来理解一下:当人们照镜子时,借助于光的反射,可以看到自身的第一部分一样。在Java中通过反射API,程序同样可以”看到”对象的很多信息。例如,它是哪个类的实例,这个类有哪些属性和方法,等每个属性的内部状态是什么,等等。当然,Java反射,不仅仅可以让我们”看到”类和对象的结构性信息,我们还可以做更多。例如,在运行时加载编译期间并不知道名字的类,探知烟灰缸结构信息,创建类的实例,调用创建实例的属性和方法,等等。用比较专业的说法,反射是指应用能够自描述和自控制的机制和能力。

通过Java反射,可以实现以下功能:

A.在运行时判断任意一个对象所属的类。

B.在运行时构造任意一 个类的对象。

C.在运行时判断任意一个类所具有的方法和属性。

D.在运行时调用任意一个对象的方法。

1.2 Java反射常用的API

Java反射技术常用的类如下:

A.Class 类:反射的核心类,反射所有的操作都是围绕该类来生成的。通过Class 类,可以获取类的属性、方法等内容信息。

B.Field 类:类的属性,可以获取和设置类中属性的值。

C.Method 类:类的方法,它可以用来获取类中的方法的信息,或者执行方法。

D.Constructor 类:类的构造方法。

在Java程序中使用反射的基本步骤如下。

(1).导入java.lang.reflect.*。

(2).获得操作的类的Java.lang.Class对象

(3).调用Class的方法获取Field、Method等对象。

(4).使用反射API进行操作。

1.3 反射的应用

1.获取Class对象

通过反射获取烟灰缸信息分为两步,首先获取Class对象,然后通过Class对象获取信息。

每个类被加载后,系统就会为该类生成一个对应的Class对象,通过该Class对象就可以访问Java虚拟机中的这个类。

使用Class类的forName()静态方法也可以获取该类对应的Class对象,它的作用就是要求JVM(Java虚拟机)查找并加载指定的类。该方法需要传入字符串参数,该字符串参数的值是某个为的完整名称,即要在类名前添加完整的包名。

例:

Class cla=Class.forName(“java.lang.String”); //正确

Class cla=Class.forName(“String”); //错误

注意:如果传入的类名字符串有错误或者没有写类的完整名称,JVM就无法在类路径中找到对应的类,就会抛出一个ClassNotFoundException异常。

2.从Class对象获取信息

在获得了某个类所对应的Class对象之后,程序就可以调用Class对象的方法来获得该类的真实信息。Class类提供了大量实例方法来获取Class对象所对应类的详细信息。

如果希望获取Class对象所包含的信息,常用的方法:

A.Constructor[] getConstructors() 返回此Class所表示的类的所有public构造方法

B.Method[] getMethods() 返回此Class对象所表示的类的所有public方法

C.Method[] getDeclaredMethods() 返回Class对象所表示的类的全部方法,与方法的访问级别无关

D.Field[] getFields() 返回此Class对象所表示的类的所有public属性

E.Field[] getDeclareFields() 返回此Class所表示的全部属性,与属性的访问级别无关

F.Object get(Object obj) 得到引用类型属性值。例如:

Strudent p=new Student();

nameField.get(p); //nameField为Field对象

好了,这里只列举一些常用的方法,但是获取Class对象信息的方法还有很多,如果想进一步了解,可以通过查看相关API文档进行补充学习。

Class对象可以获得该类里的成员包括方法、构造方法用属性。其中,方法由Method对象表示,构造方法由Constructor对象表示,属性由Field对象表示。

Method、Constructor、Field这3个类都定义在java.lang.reflect包下,并实现了java.lang.reflect.Member接口,程序可以通过Method对象来执行对应的方法,通过Constructor对象来调用相应的构造方法创建对象,通过Field对象直接访问并修改对象的属性值。

3.创建对象

通过反射来创建对象可以使用Class对象的newInstance()方法创建对象。

使用Class对象的newInstance()方法来创建该Class对象对应类的实例,要求该Class对象的对应类有无参构造方法,而执行newInstance()方法时实际上是利用无参构造方法来创建该类的实例。

示例:根据类的名字创建类

关键代码:

package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class TestRef {
private int id;
private String name;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public void say() {
System.out.println("hello");
}

public TestRef() {
}

public TestRef(int id, String name) {
this.id = id;
this.name = name;
}

// 测试反射方法
@SuppressWarnings({ "rawtypes", "unused" })
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
Object retBean = null;
Class clz = null;
// 根据名称得到对应的Class对象
try {
clz = Class.forName("reflect.TestRef");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 获取所有public 构造方法
Constructor[] ctors = clz.getConstructors();
System.out.println(ctors[0] + "\n" + ctors[1]);
// 获取所有public 方法
Method[] method = clz.getMethods();
System.out.println(method[0]);
// 使用newInstance()方法创建对应类的实例,并调用方法
TestRef testRef = (TestRef) clz.newInstance();
testRef.say();
}
}


这里只是简单的使用了几个方法,还有一些方法,大家可以尝试尝试……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  反射机制 struts java