反射机制_经典案例解析

2019-12-27  本文已影响0人  小安的大情调

努力努力再努力xLg

反射

​ 通过Class对象获取class文件中的成员变量Filed、构造方法Constructor、方法Method的过程。

所谓万物皆对象,在Java中所有的对象都是有属于自己的Class对象。所以通过反射机制,可以很轻松的实现意想不到的功能。

​ 所以可以看作为框架设计的灵魂。

​ 它可以将类的各个组成部分封装为其他对象,这便是反射机制

好处

  1. 可以在程序运行过程中,操作这些对象。
  2. 可以解耦,提高程序的可扩展性。

有一处需要注意

​ 同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。

​ 所以在同一一次运行中,使用字节码获取到的不同名称的对象,实则都是同一个对象。

案例介绍

​ 需求:写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法

​ 具体实现,这里选用配置文件加上反射机制,对任意类的实例化

package com.java.reflect;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * 需求:
 * 写一个"框架",不能改变该类的任何代码的前提下,
 * 可以帮我们创建任意类的对象,并且执行其中任意方法
 * <p>
 * 实现: 使用配置文件 配置 实例对象名称
 * 再使用反射机制,对对象名称进行实例化
 *
 * @author by Mr. Li
 * @date 2019/12/27 14:45
 */
public class Test {
    public static void main(String[] args) throws Exception {
        // 1. 第一步 读取 配置文件
        // 1.1 创建Properties类
        Properties properties = new Properties();
        // 使用当前类的classloader 获取 文件流对象
        InputStream is = Test.class.getClassLoader().getResourceAsStream("pro.properties");
        properties.load(is);

        // 2.使用反射 对配置文件中 要求的实例对象进行实例化
        Class<?> clazz = Class.forName(properties.getProperty("className"));
        String method = properties.getProperty("classMethod");
        Object o = clazz.newInstance();// 实例化
        clazz.getMethod(method).invoke(o);
    }
}

希望 东西一点一点累计,能力一点一点攀升!加油

上一篇 下一篇

猜你喜欢

热点阅读