Java反射

1. 反射入门

1.1 反射 :reflection

  • 程序可以访问、检测和修改它自身状态或行为的能力,即自描述和自控制

  • 实现在运行时加载、探知和使用编译期间完全未知的类

    • 基于反射自由创建对象
    • 反射构建出无法直接访问的类
    • set或者get到无法访问的成员变量
    • 调用不可访问的方法
  • 实现通用的数组操作代码

  • 实现类似函数指针的功能

1.2 创建对象的方法

  • 静态编码&编译

    直接new调用构造函数

  • 克隆(clone)

    没有调用构造函数

  • 序列化(serialization)和反序列化(deserialization)

  • 反射

    1. newInstance 调用构造函数
        A obj = (A)Class.forName("A").newInstance();
    
    2. newInstance 调用构造函数
        Constructor<A> constructor = A.class.getContructor() ;
    	A obj = constructor.newInstance();
    

2. 反射关键类

2.1 Class:类型标识

  • JVM为每个对象都保留其类型标识信息(Runtime Type Identification)

  • 三种获取方式

    • 对象实例.getClass()
    • Class.forName(""),例如Class.forName("java.lang.String")
    • Class.Class,例如String.class
  • 成员变量、方法、构造函数、修饰符、包、父类、父接口

    • Filed(getFilelds()、getDeclareFields())
    • Package(getPackage())
    • 接口Class(getInterfaces())
    • Constructor(getConstructors())
    • Method(getMethods()、getDeclareMethods())
    • 修饰符(getModifiers())
    • 父类Class(getSuperClass())
    • Annotation(getAnnotation())

3. 反射应用

  • 数据库连接
  • 数组扩充器
  • 动态执行方法
  • Json和Java对象互转
  • Tomcat的Servlet对象创建
  • MyBatis的OR/M
  • Spring的Bean容器

4. 编译器API

4.1 反射

  • 可以查看对象的类型标识
  • 可以动态创建对象、访问其属性、调用其方法
  • 前提:类(class文件)必须先存在

4.2 编译器API

  • 对.java文件即时编译
  • 对字符串即时编译
  • 监听在编译过程中产生的警告和错误
  • 在代码中运行编译器(并非Runtime命令行调用javac命令)

4.3 JavaCompiler

  • 自Java1.6推出,位于javax.tools包中
  • 可用在程序文件中的Java编译器接口(代替javac.exe)
  • 在程序中编译java文件,产生class文件
  • run方法(继承自java.tools.Tools):较简单。可以编译java源文件,生成class文件,但不能指定输出路径,监控错误信息,调用后就在源码所在目录生成class文件
  • getTask方法:更强大的功能。可以编译java源文件,包括在内存中的java文件(字符串),生成class文件

4.4 Java编译器API作用

  • Java EE的JSP编译
  • 在线编程环境
  • 在线程序评判系统(Online Judge系统)
  • 自动化的构建和测试工具
posted @ 2022-07-17 22:14  hunter-w  阅读(19)  评论(0编辑  收藏  举报