java学习之 反射机制

参考自 http://www.cnblogs.com/gulvzhe/archive/2012/01/27/2330001.html


Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。当然反射本身并不是一个新概念,它可能会使我们联想到光学中的反射概念,尽管计算机科学赋予了反射概念新的含义,但是,从现象上来说,它们确实有某些相通之处,这些有助于我们的理解。

Java反射机制主要提供下面几种用途:

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

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

    在运行时判断任意一个类所具有的成员变量和方法

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


使用java的反射机制,一般需要遵循三步:

    1. 获得你想操作类的Class对象

        Class<?> cls = Class.forName(“java.lang.String”);// 获得Class

    2. 通过第一步获得的Class对象去取得操作类的方法或是属性名

        Method[] methods = cls.getMethods();// 通过Class获得所对应对象的方法

        Method method = cls.getMethod("show", String.class);// 通过Class获得DisPlay类的show方法   

        Field[] fromFields = cls.getDeclaredFields();// 取得拷贝源对象的属性列表

    3. 操作第二步取得的方法或是属性

        method.invoke(disPlay, "Wanggc");// 调用show方法

        String name = fromField.getName();// 取得拷贝源对象的属性名字

        fromField.get(from)// 获取拷贝源对象的属性的值

        Field destField = destClass.getDeclaredField(name);// 取得拷贝目标对象的相同名称的属性

        destField.set(obj, fromField.get(from));// 将拷贝源对象的属性的值赋给拷贝目标对象相应的属性

        fromField.setAccessible(true);// 设置属性的可访问性

        destField.setAccessible(true);


Java运行的时候,某个类无论生成多少个对象,他们都会对应同一个Class对象,它表示正在运行程序中的类和接口。如何取得操作类的Class对象,常用的有三种方式:

    1. 调用Class的静态方法forName,如上例;

    2. 使用类的.class语法,如:Class<?> cls = String.class;

    3. 调用对象的getClass方法,如:String str = "abc";Class<?> cls = str .getClass();


你可能感兴趣的:(反射,fava)