时间:2022-09-30 06:46:22
摘要:剖析了Java反射机制原理,反射可获取Java类的包括属性、方法、构造器等所有信息。反射机制还是SSH框架的基础。通过一个实例分析了Java反射机制的强大功能。
关键词:反射机制;API;构造器
中图分类号:TP311.5 文献标识码:A文章编号:1007-9599 (2011) 09-0000-01
Mystery Exploration of Java Reflection Mechanism
Zhang Hang,Lan Wenfei
(College of Computer Science,South-central University for Nationalities,Wuhan430074,China)
Abstract:The analysis of the Java reflection principle,reflection can access Java classes,including properties,methods,constructors and all other information.Reflection or SSH framework.Through a case study of the power of Java reflection mechanism.
Keywords:Reflection mechanism;API;Constructor
一、反射原理
反射机制(Reflection)是Java提供的一项较为高级的功能,它提供了一种动态功能,而此功能的体现在于通过反射机制相关的API就可以获取任何Java类的包括属性、方法、构造器、修饰符等信息。元素不必在JVM运行时进行确定,反射可以使得它们在运行时动态地进行创建或调用。反射技术在中间件领域应用得较多。
二、Class类
Java程序在运行时,JRE会标识所有对象运行时的类型。此信息纪录了每个对象所属的类。JVM通常使用运行时类型信息选准正确方法去执行,而用来保存这些类型信息的类是Class类。作为反射开发的入口,Class类在反射机制中起到了至关重要的作用。每一个Class类的实例就代表了一种被加载进入JVM的类,它代表该类的一种信息映射,程序员可以通过以下三种方法得到Class类的对象:A)调用Class类的forName()方法获取Class对象;B)访问所有类都拥有的静态的class属性;C)调用所有对象都有的getClass()方法,这是最常见的产生Class对象的方法。Class类有一些常用方法,如getName()、newInstance()、getClassLoader()等。此外,Class有一些常用技巧:A)forName()和newInstance()结合使用,可根据存储在字符串中的类名创建对象。B)JVM为每种类型管理一个独唯一的Class实例,故可这样比较类对象:
if(m.getClass()==Person.class)
三、Class类操作类成员
(一)操作成员属性。Field类代表类的成员变量,它通过Class类的getDeclaredField()或getDeclaredFields()方法得到,它在java.lang.reflect包下。Field提供有关类或接口的单个字段的信息以及对其动态访问权限,反射的字段可以是类的字段,或是对象的字段。Field对象有两大方法:A)setXXX():设置某个对象该字段的值,它的两个参数分别为对象引用和设置的值;B)getXXX():获取某个对象该字段的值,如getFloat()\getInt()等。(二)操作成员方法。Method类代表类得方法,反射可以获取它的对象,Method对象通过Class类的getMethod()或getMethods()方法得到。invok()是其常用方法,通过它来完成动态调用。
四、实例
import java.lang.reflect.*;
class Person{
protected String name;
private int age;
public Person(){}
public Person(String name,int age)
{ super();
this.name=name;
this.age=age;
}
public void fun()
{ System.out.println("fun is called...");}
}
public class MainReflect{
public static void main(String[] args){
Person p1=new Person("Zhang",24);
try{ //获取Field对象
Field f=p1.getClass().getDeclaredField("age");
f.setAccessible(true);//设置访问性
System.out.println(p1.name+"'sage is"+f.get(p1));
Classc=Person.class;//得到Class实例
Person p2=c.newInstance();//创建一个新对象
//获取指定方法的Method对象
Method m=c.getDeclaredMethod("fun");
m.invoke(p2);
}catch(Exception e){}
}
}
程序运行结果:
五、结束语
反射机制是Java的一项高级功能,通过它可以获取任何类的全部信息,即动态调用。反射机制还是目前非常流行的Struts,Spring,Hibernate框架的基础,SSH会频繁地使用反射API进行其动态功能。
参考文献:
[1]Bass L,Clements P.Software Architecture in Practice[M].2ed.[S.l.]:Addison Wesley,2003.
[2]潘彬斌.用Java反射机制简化Struts框架逻辑控制[J].北京:微计算机信息,2009,1(3):195-197
[3]杨磊.Java程序员面试宝典[M].北京:清华大学出版社,2010
[作者简介]张航(1987-),男,湖北省黄冈市人,中南民族大学10级硕士研究生,主要研究方向:数据库。