Java反射(一)

一.什么是反射

Reflection指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。

加载完类后,在内存的方法区中产生了一个Class类型的对象(只有一个),这个对象包含了完整的类结构信息,通过这个对象可以看到类的信息。

Class c = Class.forName("com.se.reflection.Stu");
  • 一般:引入类名称,new实例化,获得实例化对象
  • 反射:实例化对象,getClass()获得相应类名称

二.Class类

Class类是Reflection的根源

每个Class对象对应一个class文件

通过Class可以获得一个类的结构

Class对象由系统建立

获取Class类示例方法:

  • 已知具体类,通过class属性获取
    Class cl = Stu.class;
  • 已知类的一个实例对象,调用getClass()获取Class对象
    Class cl = stu.getClass();
  • 已知类的类全名称,并且该类在类路径下,通过forName()获取
    Class cl = Class.forName("com.se.Stu");
  • 内置数据类型,直接类名.TYPE
    Class cl = Integer.TYPE;

     

     

拥有Class对象的类型:class,[],interface,enum,annotation,void,基本数据类型

三.类加载与类初始化

类初始化:

类主动引用(发生类初始化):

  • 虚拟机启动时先初始化main方法所在类
  • new一个类对象
  • 调用类的静态成员和方法
  • 对类反射调用
  • 初始化类时,会先初始化其没有被初始化的父类

被动调用(不初始化):

  • 通过数组定义类引用
  • 引用常量
  • 访问静态域时,只有真正声明这个域的类才会被初始化          
posted @ 2021-10-05 21:57  酥炸小黄瓜  阅读(36)  评论(0)    收藏  举报