java 反射

87 阅读2分钟
  • 框架:半成品的软件,可以在框架的基础上进行软件开发,简化代码

  • 反射:将类的各个部分封装为其他对象

    • 优点:
      1. 在程序的运行过程中操作这些对象。
      2. 可以解耦,提高程序的可扩展性。
  • 获取Class对象的三种方式

    1. Class.forName("全类名");(多用于配置文件,将类名可以定义在配置文件中,读取文件加载类)

      将字节码文件加载进内存

    2. 类名.class:(多用于参数的传递)

      通过类名的属性获取

    3. 对象.getClass() (多用于对象的获取字节码方式)

      通过对象方法获取,该方法在Object中有定义

    • 结论:

      同一个字节码文件(.class)在一次运行过程中,只会被加载一次,

      不论用什么方式获取到的Class都是同一个

  • Class对象的功能:

    • 获取功能:

      1. 获取成员变量s:

        Filed[] getFiles() : 获取所有public成员变量

        Field getFiled(String name) : 获取指定名称的public成员变量

        Filed[] getDeclaredFiles() : 获取所有的成员变量

        Field getFiled(String name) : 获取制定名称的成员变量

      2. 获取构造方法s:

        Constructor[] getConstructors()

        Constructor getContructor(class<?> ...parmeterTypes)

        Constructor[] getConstructors()

        Constructor getContructor(class<?> ...parmeterTypes)

      3. 获取成员方法s:

        Method[] getMethods() : 获取所有的成员方法

        Method getMethod(String name, Class parmetertypes ) : 获取单个成员方法

        Method[] getDeclaredMethods() : 获取所有的成员方法

        Method getDeclaredMethod(String name, class parmetertypes ) : 获取单个成员方法

      4. 获取类名:

        String getName() : 获取类名

  • Field:成员变量

    • 操作: 1. 设置值: void set(Object obj, Object value) 2. 获取值 : get(Object obj) 3. 忽略访问权限修饰符的安全检查(暴力反射):setAccessible(true)
  • Constructor:构造方法

    • 操作:

      1. 创建对象:T newInstance(Object..., initargs)

      2. 创建空参对象:T newInstance() == Class.newInstance

  • Method:成员方法

    • 操作:
      1. 执行方法:Object invoke(Object obj, Object... args)

      2. 获取方法名称:String getName