首页 > 技术文章 > 反射

a591378955 2017-12-10 16:37 原文

一、类的加载

  当程序要使用某个类时,如果该类还未加载到内存中,则系统会通过加载连接初始化三步来实现对该类进行初始化。

  1、加载

    将class文件读入内存,并为之创建一个class对象。任何类使用时系统都会创建一个class对象。

  2、连接

    验证:是否有正确的内部结构,并和其他类协调一致

    准备:负责为类的静态成员分配内存,并设置默认初始化值

    解析:将类的二进制数据中的符号引用替换为直接引用

  3、初始化

    new创建对象时的初始化过程

二、类初始化时机

  1、创建类的实例

  2、类的静态变量,或者为静态变量赋值

  3、类的静态方法

  4、使用反射方式来强制创建某个类或者接口对应的java.lang.Class对象

  5、初始化某个类的子类

  6、直接使用java.exe命令来运行某个主类

三、类加载器

  将.class文件加载到内存中,并为之创建class文件对象

四、类加载器的组成

  1、Bootstrap ClassLoader 根类加载器

    也被称为引导类加载器,负责java核心类的加载

    比如System、String等,在JDK中JRE的lib目录下rt.jar文件中

  2、Extension ClassLoader 扩展类加载器

    负责JRE的扩展目录中的jar包的加载,在JDK中JRE的lib目录下的ext目录

  3、System ClassLoader 系统类加载器

    负责Jvm启动时加载来自java命令的class文件,一集classpath环境变量所指定的jar包和路径

五、Class类

  获取class对象的三种方式:

  1、Object类的getClass()方法

  2、通过  类名.class  获得

  3、通过Class类的静态方法forName(String className)(注:className必须是全类名)

六、反射通过配置文件运行的步骤

  运行的类名和方法名,以键值对的形式,写在文本中

  运行哪个类,读取配置文件即可

  实现步骤:

    1、准备配置文件,键值对

    2、IO流读取配置文件 Reader

    3、文件中的键值对存储到集合中 Properties

      集合保存的键值对,就是类名和方法名

    4、反射获取指定类的class文件对象

    5、class文件对象,获取指定的方法(getMethod())

    6、运行指定方法(invoke())

 public static void main(String[] args) throws Exception{
        //IO流读取配置文件
        FileReader fr = new FileReader("config.properties");
        //创建集合对象
        Properties prop = new Properties();
        //传递流对象
        prop.load(fr);
        //关闭流
        fr.close();
        //通过键获取值
        String className = prop.getProperty("className");
        String methodName = prop.getProperty("methodName");
        //通过反射获取指定类的class对象
        Class clazz = Class.forName(className);
        //获取指定的方法名
        Method method = clazz.getMethod(methodName,null);
        //调用方法
        method.invoke(method,null);
    }

 

推荐阅读