首页 > 技术文章 > Java 反射机制

ruhuanxingyun 2020-08-25 15:51 原文

简介:反射机制指在程序运行过程中,对任意一个类都能获取其所有属性、方法和构造函数,并且对任意一个对象都能调用其任意一个方法。

   优点:能够运行时动态获取类的实例,大大提高系统的灵活性与扩展性;

      与Java动态编译相结合,可以实现更加强大的功能;

      对于 Java 这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象;

   缺点:

      反射会消耗一定的系统资源,因此能不用就不用;

      反射调用方法时可以忽略权限检查,获取这个类的私有属性和方法,因此会破会类的封装性而导致安全问题。

 

一、Class类对象

  1. 作用:用于获取类的属性和方法等信息;

  2. 获取方式

    A. 根据类名:类名.class;

    B. 根据对象:对象.getClass();

    C. 根据全限定类名:Class.forName(全限定类名)。

  3. 常用方法

    A. forName():获取Class对象的一个引用;

    B. getName():获取全限定的类名(包括包名);

    C. getSimpleName():获取类名(不包括包名);

    D. isInterface():判断Class对象是否是表示一个接口;

    E. getInterfaces():表示Class对象所引用的类所实现的所有接口。


二、Constructor构造器

  1. 作用:表示Class对象所表示的类的构造方法;

  2. Class类相关方法

    A. Constructor  getConstructor(Class<?>... parameterTypes):返回指定参数类型、具有public访问权限的构造函数对象;

    B. Constructor<?>[]  getConstructors():返回所有具有public访问权限的构造函数的Constructor对象数组;

    C. Constructor  getDeclaredConstructor(Class<?>... parameterTypes):返回指定参数类型、所有声明的(包括private)构造函数对象;

    D. Constructor<?>[]  getDeclaredConstructor():返回所有声明的(包括private)构造函数对象返回所有声明的(包括private)构造函数对象返回所有声明的(包括private)构造函数对象;

    E. T  newInstance():调用无参构造器创建此 Class 对象所表示的类的一个新实例。

  3. Constructor类相关方法

    A. Class  getDeclaringClass():返回 Class 对象,该对象表示声明由此 Constructor 对象表示的构造方法的类,其实就是返回真实类型(不包含参数);

    B. String  getName():以字符串形式返回此构造方法的名称;

    C. Class<?>[]  getParameterTypes():按照声明顺序返回一组 Class 对象,即返回Constructor 对象所表示构造方法的形参类型。

 

三、Field字段

  1. 作用:表示类的成员变量,用于获取和设置类中的属性值;

  2. Class类相关方法

       A. Field  getDeclaredField(String name):获取指定name名称的(包含private修饰的)字段,不包括继承的字段;

    B. Field[]  getDeclaredField():获取Class对象所表示的类或接口的所有(包含private修饰的)字段,不包括继承的字段;

    C. Field  getField(String name):获取指定name名称,具有public修饰的字段,包含继承字段;

    D. Field[]  getField():获取修饰符为public的所有字段,包含继承字段。

  3. Filed类相关方法

    A. void  set(Object obj, Object value):将指定对象变量上此Field对象表示的字段设置为指定的新值;

    B. Object  get(Object obj):返回指定对象上此Field表示的字段的值;

    C. Class<?>  getType():返回一个Class对象,它标识了此Field对象所表示字段的声明类型;

    D. String  getName():返回此Field对象表示的字段的名称;

    E. void  setAccessible(boolean flag):将此对象的accessible标志设置为指示的布尔值,即设置其可访问性。

 

四、Method方法

  1. 作用:表示类的方法,用于获取方法的描述信息或者执行某个方法;

  2. Class类相关方法

    A. Method  getDeclaredMethod(String name, Class<?>... parameterTypes):返回一个指定参数的Method对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法;

    B. Method[]  getDeclaredMethod():返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法;

    C. Method  getMethod(String name, Class<?>... parameterTypes):返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法;

    D. Method[]  getMethods():返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。

  3. Method类相关方法

    A. Object  invoke(Object obj, Object... args):对带有指定参数的指定对象调用由此 Method 对象表示的底层方法;

    B. Class<?>  getReturnType():返回一个 Class 对象,该对象描述了此 Method 对象所表示的方法的正式返回类型,即方法的返回类型;

    C. Class<?>[]  getParameterTypes():按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型。即返回方法的参数类型组成的数组;

    D. String  getName():以 String 形式返回此 Method 对象表示的方法名称,即返回方法的名称。

 

推荐阅读