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

TAG: java 反射 Reflection Java

 

评分:0

我来说两句

smile665

smile665

Stay hungry, stay foolish. 得意之时谨记,一半命运还掌握在上帝手里;失意之时须知,一半命运还掌握在自己手里。

日历

« 2024-04-20  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 955182
  • 日志数: 220
  • 建立时间: 2008-11-06
  • 更新时间: 2012-10-06

RSS订阅

Open Toolbar