All things are difficult before they are easy. 没有软件的裸机是一具僵尸,没有硬件的软件是一个幽灵。2012,专注于Linux和C语言,关注自动化、性能测试,关注开源社区和开源测试工具、方法,尝试测试团队管理!
Java反射机制浅析
上一篇 /
下一篇 2010-10-13 00:04:53
/ 个人分类:Java
Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”。
在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(
Reflection)机制。
Java 反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法。
Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection
APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static
等等)、superclass(例如Object)、实现之interfaces(例如Serializable),也包括fields和methods
的所有信息,并可于运行时改变fields内容或调用methods。
一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点
看,Perl,Python,
Ruby是动态语言,C++,Java,C#不是动态语言。
尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒
影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称
的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透
class”的能力(the ability of the program to examine
itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:
Class类:代表一个类。
Field 类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor 类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
贴一个自己使用反射的简单代码:
import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;
public class TestReflection { public static void main(String[] args) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException { if (args.length != 1) { return; } try { Class p = Class.forName(args[0]); Constructor[] cons = p.getConstructors(); // for (int i=0;i<cons.length;i++) { // System.out.println(cons[i]); // } // Method[] methods = p.getDeclaredMethods(); // for (int i=0;i<methods.length;i++) { // System.out.println(methods[i]); // } Class[] params = cons[0].getParameterTypes(); Object[] paramValues = new Object[params.length]; for (int i=0;i<params.length;i++) { if ( params[i].isPrimitive() ) { paramValues[i] = new Integer(i+5); } } Object pp = cons[0].newInstance(paramValues); Method[] methods = p.getDeclaredMethods(); methods[0].invoke(pp, null); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
}
class Point { int x,y; static { System.out.println("Loading Point class"); } void output() { System.out.println("x="+x+","+"y="+y); } public Point(int x, int y) { // TODO Auto-generated constructor stub this.x = x; this.y = y; } }
|
详细了解反射机制,请参考如下资料:
http://lavasoft.blog.51cto.com/62575/43218
http://dev.csdn.net/htmls/49/49876.html
http://tech.it168.com/j/2007-10-21/200710211609265.shtml
http://orangewhy.javaeye.com/blog/56011
相关阅读:
- Java的对象序列化以及文件IO处理 (xin_晴, 2010-9-27)
- 甲骨文发布移动版Java发展路线图 (xin_晴, 2010-9-27)
- Java多线程的两点误区 (xin_晴, 2010-9-28)
- Java学习之路 (xin_晴, 2010-9-29)
- 初学者如何开发出高质量J2EE系统 (xin_晴, 2010-10-26)
- 对Java语言入门初学者的一些建议 (xin_晴, 2010-10-08)
- 成为Java高手的25个学习目标 (xin_晴, 2010-10-09)
- J2ME内存占用详解及优化方法 (xin_晴, 2010-10-11)
- 甲骨文与IBM将联手发展Java技术 (xin_晴, 2010-10-12)
- Java设计模式之综述篇 (xin_晴, 2010-10-12)
收藏
举报
TAG:
java
反射
Reflection
Java