java反射

1.java反射

在java中每个类都有其对应的Class,我们可以在程序中通过其Class对象来获取该类的基本信息,生成该类的对象,运行该类的方法。

为了理解反射首先来了解一下什么事Class类,其实就是类的类,在java中我们会将所有编程的对象抽象成一个类也就是一个class,这个class就含有这类事物所具有的一些基本信息(属性)和行为(方法),而对这些我们定义的类class而言,java将所有这些我们定义的类又进行了一层抽象Class也就是类的类。显而易见,在Class会包含类这个定义的一写基本信息,类名,类访问类型,属性名,属性类型,方法名,方法返回值类型,方法参数类型,构造函数,构造函数参数类型,构造函数参数类型等等。下面就是java中所定义的Class类。

同时为什么要用反射,这是我之前一直没想过的问题,后面想想觉得主要是两个原因。

  • 1.首先new出来的对象,我们是无法使用其中的私有属性和方法,但是对于反射而言,我们任然可以获取到其中的私有属性的资源。
  • 2.在编程开发时我们不知道需要使用的类名称,所以也就无法使用new 来创建(非要这样的话,也可以提前写好不同条件的判断来new不同的对象,显然这样的程序冗余很多看着头大,设计不合理的),只有当用户使用我们的程序时,这个时候根据用户的操作不同,会使用不同的类,这个时候已经无法在程序中使用new来创建对象,只能根据对应的类名使用反射的方法来创建该类的对象实例来满足用户的需求。

可见使用反射的目的就是使用反射获取类的对象并使用该对象的一些方法。我们可以简单将其分为一下三个步骤:(获取Class对象,生成Class 对象实例,获取对象的方法,属性并使用)

  • 1.获取Class对象有三种方法:

    • a.使用Class的forName()方法

      1
      Class catClass = Class.forName("com.bevis.Cat");
    • b.使用getClass()方法,这个是Object的方法

      1
      Class catClass = Cat.getClass();
    • c.使用该对象的.class()方法来获取

      1
      2
      Cat cat = new Cat();
      Class catClass = cat();
  • 2.获取对象实例两种方法

    • a.通过Class对象来

      1
      Object ojc = catClass.newInstance();
    • b.使用构造函数来创建

      1
      2
      Constructor con = catClass.getConstructor();
      Object o = con.newInstance();

      使用Class对象来创建类对象默认会使用无参的构造函数创建类对象。

  • 3.使用类对象的方法

    1
    2
    3
    4
    5
    6
      Method say = catClass.getMethod("say",String.class);
    String bye = say.invoke(obc,"bye--");
    // 加入访问的方法是private修饰时,需要下面的方法来获取方法和使用该方法,当获取的是私有方法是需要使用getDeclaredMethod()方法并将setAccessible()为true
    Method testPrivate = catClass.getDeclaredMethod("testPrivate",String.class);
    testPrivate.setAccessible(true);
    String re = testPrivate.invoke(ojc,"---testPrivate---");

    其中在Class对象中除了以上用到的属性和方法还有以下:

    还有通过反射获取到该Class对象中的注解的getAnnnotations(),也可以通过Class中的属性Field,Method等来使用getAnnotation()获取到对应元素上的注解的动态代理类对象。