反射

反射是动态语言的关键, 允许程序在执行期间获取任何类的内部信息, 并直接操作任意对象的内部属性和方法

加载完某个类后, 在堆内存的方法区中产生了一个Class类型的对象—每个类对应一个且只有唯一一个Class对象. 这个对象包含类的完整的结构信息

Java反射机制提供的功能

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时获取泛型信息
  • 在运行时调用任意一个对象的成员变量和方法
  • 在运行时处理注解
  • 生成动态代理

反射相关主要API

  • java.lang.Class: 含义是类的抽象, 不妨称为通用类, 所有的类都是该类的对象, 有些存储元数据的感觉
  • java.lang.reflect.Method: 类的方法
  • java.lang.reflect.Field: 类的成员变量
  • java.lang.reflect.Constructor: 类的构造器

java.lang.Class类的理解

  1. 程序经过javac.exe命令编译后, 会生成多个字节码文件.class
  2. 当使用java.exe执行字节码文件时, 加载到内存中的类便称为运行时类, 此运行时类就是Class类的一个对象

注意: Class类的对象不是new出来的, 而是运行时类便对应Class类的一个对象

获取运行时类的对象的方法

加载到内存中的运行时类会缓存一定的时间, 在这段时间内获取到的都是同一个运行时类的对象

最常使用的是第三种方式, 因为将类作为参数传入, 没有写死代码, 更加灵活

//      获取运行时类的方法一: 通过类名.class直接获取
        Class<Person> personClass1 = Person.class;
        System.out.println(personClass1);
//        方法二: 通过运行时类的对象获取
        Person person = new Person();
        Class<? extends Person> personClass2 = person.getClass();
        System.out.println(personClass2);
//        方法三: 调用Class的静态方法forName(), 传入类的全类名, 从蓝色的java路径开始写
        Class<?> personClass3 = Class.forName("java高级编程.反射.Person");
        System.out.println(personClass3);

反射中的常用方法

方法 作用
getFields() 获取当前运行时类及其父类中所有的public的方法
getDeclaredFields() 获取当前运行时类中所有的方法, 包括private
getModifiers() 获取权限修饰符
getType() 获取类型
getName() 获取变量名

   转载规则


《》 熊水斌 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
枚举类枚举类的使用类的对象只有有限个, 确定的. 例如: 星期: 一, 二, 三, 四, 五, 六, 日 性别: 男, 女 当需要定义一组常量时, 强烈建议使用枚举类 如果枚举类中只有一个常量, 则可以作为单例模式的一种实现方式 定义枚
2022-11-11
下一篇 
多线程基本概念: 程序, 进程和线程程序: 静态的代码 进程: 程序的一次运行过程. 有产生, 存在和消亡的过程, 即生命周期 线程: 一个进程可以并行执行多个线程. 系统会为每个进行分配内存区域, 而进程中每个线程有自己独立的运行栈和程序
2022-11-11
  目录