努力努力再努力xLg
反射
通过Class对象获取class文件中的成员变量Filed、构造方法Constructor、方法Method的过程。
所谓万物皆对象,在Java中所有的对象都是有属于自己的Class对象。所以通过反射机制,可以很轻松的实现意想不到的功能。
所以可以看作为框架设计的灵魂。
它可以将类的各个组成部分封装为其他对象,这便是反射机制
好处
- 可以在程序运行过程中,操作这些对象。
- 可以解耦,提高程序的可扩展性。
有一处需要注意
同一个字节码文件(*.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);
}
}
希望 东西一点一点累计,能力一点一点攀升!加油









网友评论