JAVA中反射机制一

声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223

反射一 基本概念

一、反射机制的基本概念

什么是反射?反射是指在运行状态中,对于任意一个类,都可以获取到这个类的所有属性和方法;对于任意一个对象,都能够调用这个对象的任意方法和属性;这种动态获取信息及动态调用对象的方法,称为JAVA语言的反射机制。

 

二、反射可以做什么

我知道了反射的概念,那么反射可以做什么呢?

  1. 在运行时可以判断任意一个对象是否属于所属的类
  2. 在运行期可以构造任意一个对象
  3. 在运行期可以获取一个类的成员变量或者方法
  4. 在运行期可以去调用一个对象的方法

 

三、反射的相关类

在JDK 中,主要有以下类来实现JAVA反射机制,这些类(除了第一个)都位于java.lang.reflect包中

Class类:代表一个类,位于java.lang包下。

Field类:代表类的成员变量(成员变量也称为类的属性)。

Method类:代表类的方法。

Constructor类:代表类的构造方法。

Array类:提供了动态创建数组,以及访问数组的元素的静态方法。

 

四、反射的基本原理

要实现反射功能,那么需要经过加载类,和解析类两个步骤;所谓加载类,即将类的字节码加载到内存中去,然后去解析这个类,从而得到所要的属性或者方法。

例如:用于反射的类,如Method,可以在java.lang.reflect包中找到。使用这些类的时候必须要遵循三个步骤:

第一步:获得你想操作的类的java.lang.Class对象。在运行中的Java程序中,用java.lang.Class类来描述类和接口等。

第二步:调用诸如getDeclaredMethods的方法,取得该类中定义的所有方法的列表。

第三步:使用反射的API来操作这些信息。

 

五、加载类,即获取Class对象的三种方式

1.使用Class类的静态方法。例如:  

Class.forName("java.lang.String");

2.使用类的.class语法。如:

String.class;

3.使用对象的getClass()方法。如:

String str = "aa";

Class<?> classType1 = str.getClass();

getClass()方法定义在Object类中,不是静态方法,需要通过对象来调用,并且它声明为final,表明不能被子类所覆写。

直接print所获得的Class对象classType会输出:

class 完整类名

如果调用该Class对象的getName()方法,则输出完整类名,不加class。

 

六、实例演示

package study.reflect;

 

public class Demo01

{

    /**

     * 反射,加载类,获取类的字节码

     * @param args

     * @throws Exception

     */

    public static void main(String[] args) throws Exception

    {

       //1.

       Class<?> clazz = Class.forName("study.reflect.Person");

      

       //2.

       Class<?> clazz1 = new Person().getClass();

      

       //3.

       Class<?> clazz2 = Person.class;

      

       /**

        * 通过上面的三种方式,加载类已经完成,获取到了类的字节码,那么Class 提供了那些方法呢?

        * public Constructor<T> getConstructor(Class<?>... parameterTypes)

           public Method getMethod(String name,Class<?>... parameterTypes)

           public Field getField(String name)

        *

        * 也就说,和定义里面说的一样,我们可以拿到类的属性,方法 ,构造函数等相关的东西

        *

        *

        */

    }

 

}

 

 

七、思考,我们解剖出了这些成员后有什么用呢?

提示:构造函数,创建对象;属性,用于保存数据;方法,可以执行某些功能。

posted on 2017-08-28 21:12  pony1223  阅读(1084)  评论(0编辑  收藏  举报

导航