0%

Java之反射(reflection)

反射是后续web框架学习的基础!

1. 概念

Java的反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法的功能称为Java语言的反射机制。亦即动态获取类中的信息,可以理解为对类的解剖。

2. Class类

在程序运行期间,Java运行时始终为所有的对象维护一个被称为运行时的类型标识,这个信息跟踪着每个对象所属的类,保存这些信息的类被称为Class。

2.1 Class对象的获取

Random r = new Random();
Class clazz = r.getClass();
-------------------------------------------
String className = "java.util.Random";
Class clazz = Class.forName(className);
-------------------------------------------
Class clazz = Random.class;  //if you import java.util.*;

2.2 Class类的相关方法:

  • public String getName(); 获取Class对象的类名。

    示例:

    Random r = new Random();
    Class clazz = r.getClass();
    String name = clazz.getName();    //name is set to "java.util.Random"
  • public Object newInstance(); //返回这个类的一个新实例(构造方法为空参)。

     示例:
    String s = "java.util.Random";
    Object obj = Class.forName(s).newInstance();
    Random r = (Random)obj;

3. Field类

该类用于描述类的属性(域)

3.1 Field对象的获取

  • Filed[] getFields();

    返回一个包含Field对象的数组,这些对象记录了这个类或其超类的公有域。

  • Field[] getDeclaredFields();

    返回一个包含Field对象的数组,这些对象记录了这个类的全部域

  • Filed getFiled(String name);

    获取指定名称的公有域

3.2 Filed类的相关方法

  • Class getType();

    返回Filed对象的类型所对应的Class对象。比如有属性定义:String name = “zzz”;那么该方法返回的即为字符串name所对应的Class对象。

  • int getModifiers();

    返回一个用于描述构造器、方法或域的修饰符的整型数值。可以使用Modifier类中的静态方法toString(int modifilerNum)来显示该数值所对应的修饰符。

3.3 Field类的对象域值

  • Object get(Object obj);

    返回Object对象中用Field对象表示的域值。如果是类中的属性是基本数据类型则返回对应的包装类。

  • void set(Object obj, Object newValue);

    用一个新值设置Obj对象的中Field对象表示的域

  • void setAccessible(Boolean falg);

    类中的私有属性是不可以通过get(Object obj)方法获取到的。该方法为反射对象设置可访问标志。flag为true表明屏蔽Java语言的访问检查,使得对象的私有属性也可以被查询和设置。

  • static void setAccessible(Fileds[] fields, boolean flag);

    fields为需要设置访问标志的字段对应的Filed对象,该方法时设置对象数组可访问标志的快捷方法。

4. Method类

4.1 Method对象的获取

  • Method getMethod(String name, Class… parameterTypes);

    第一个参数为方法名,第二个参数为该方法的参数的类型

    示例:
    比如存在一个类Person,有一个void eat(String foodName);方法。
    那么可以使用getMethod方法获取Person类的eat方法的Method对象。
    Method eatMethod = Person.class.getMethod(“eat”, String.class);

  • Method getMethod(String name);

    通过方法名去获取Method对象。

  • Method[] getMethod();

    返回所有的公有方法,包括从超类继承来的公有方法。

  • Method[] getDeclaredMethod();

    返回这个类或接口的全部方法,但不包括由超类继承了的方法。

    4.2 Method类的相关方法

  • Class getReturnType();

    返回一个用于描述返回类型的Class对象。

  • Class[] getParameterTypes();

    返回一个用于描述参数类型的Class对象数组。

  • Object invoke(Object implictParameter, Object[] explicitParamemters);

    调用这个对象所描述的方法,传递给定参数,并返回方法的返回值。第一个参数为调用该方法的对象,第二个参数为该方法需要传入的参数值。对于静态方法。把null作为隐式参数传递。在使用包装器传递基本类型的值时,基本类型的返回值必须是未包装的。

    5. Constructor类

    5.1 Constructor对象的获取

  • Constructor[] getConstrcutors();

    返回包含Constructor对象的数组,其中包含了Class对象所描述的类的所有公有构造器

  • Constructor[] getDeclaredConstrcutors();

    返回包含Constructor对象的数组,其中包含了Class对象所描述的类的所有构造器

    5.2 Constructor类的相关方法

  • Object newInstance(Object[] args);

构造一个这个构造器所属类的新实例。数组参数若有基本数据类型,需传入对应的包装类。

------ 本文结束------