探寻Java反射机制的奥秘

时间: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级硕士研究生,主要研究方向:数据库。

上一篇:医院物资网络管理系统的开发和应用 下一篇:中职VB课程中递归算法教学探索和思考