学习反射(反射的使用,反射的应用场景)

目录

反射的使用

总的测试代码如下

反射的应用场景


反射的使用

大家先看一个案例

有一个person 类 属性有 String 类型的 name ,int age ,还有一个 方法 a。

java 复制代码
package fs;

public class Person {
    private String name;
    private int age;
    public void a(){
      System.out.println("做一个 person");
  }
}

有一个Student 类 属性有 String 类型的 name ,gerder ,还有一个方法 a

java 复制代码
package fs;

public class Student {
String name;
String gerder;
    public void a(){
        System.out.println("做一个student");
    }
}

要求是 调用其中一个 对象的方法或属性【注意我们没有具体指定是哪一个对象】

一般写法如下

1 写一个测试类

2 简单的new 一个对象 ,再 调用它的方法或属性

java 复制代码
    new Student().a();
        new Person().a();

3 看具体需要哪个,不需要的直接注释掉就行了。

但现实情况是 有很多个类,这时候如果把不需要的直接注释掉,那样操作太繁琐了。

怎么才可以不改动自己原本写的代码情况下,调用类的方法 那么这时候应该怎么做呢?

这时候需要使用到我们复习的反射了 ,基于本案例 使用反射解决,基本步骤如下:

  • 写配置文件,内容包括类名路径,方法名
  • 加载配置文件 ,调用方法获取 配置文件内容
  • 类加载器加载
  • 获取创建的类对象
  • 调用方法

具体步骤如下

1 写配置文件,内容包括类名路径,方法名

1.1 创建一个配置文件 一般是config.properties 在src 下的resource目录下 放置

为什么要放在resource目录下?

原因

  • resource目录下,是专门放置资源文件的【这里的资源文件常指的各种配置文件】
  • 我们之后使用的 getBundle()方法加载配置文件 指定目录也是在resource目录下的

1.2 配置文件需要有 类的路径和方法名

注意: 在配置文件中,写法多以键值对的形式书写: key=value 或 key :value

  • 这里我就拿 Student 类举例,如果要的是,Person 类,相信大家也清楚如何修改

2 加载配置文件 ,调用方法获取 配置文件内容

2.1 在测试类中 调用 getBundle()参数为 配置文件名 获取加载配置文件对象

java 复制代码
  ResourceBundle config = ResourceBundle.getBundle("config");

2.2 调用getString()方法 ,参数为 key值

java 复制代码
       String className = config.getString("className");
        String methodName = config.getString("methodName");

3类加载器加载

3.1 获得类加载器器对象,参数为 通过上一步获得代表类路径的value值

java 复制代码
  Class<?> aClass = Class.forName(className);

3.2通过调用 newInstance()方法获取创建的类对象

java 复制代码
 Object obj = aClass.newInstance();

4 调用方法

java 复制代码
       Method method = aClass.getMethod(methodName);
        method.invoke(obj);

最后运行结果如下

  • 那么如果我要改成Person 类的,是不是只需要修改配置文件就可以了

总的测试代码如下

java 复制代码
 // 加载配置文件
        ResourceBundle config = ResourceBundle.getBundle("config");
        String className = config.getString("className");
        String methodName = config.getString("methodName");
        Class<?> aClass = Class.forName(className);
        // 创建类的对象
        Object obj = aClass.newInstance();
        Method method = aClass.getMethod(methodName);
        method.invoke(obj);

反射的应用场景

大家看之前,通过反射来完成,是不是更加麻烦了。之前就只要写两行代码,不需要的就注释掉。似乎这种方式更加方便!,但事实真的是这样吗?

疑问

1.1 学习反射有意义吗

首选我要告诉大家,我们真正手写反射的概率很少。但反射无处不在!特别是在我们学习各种框架后,关于反射的思想,就藏在各种细节中 。因此我们很有必要学习反射。

1.2 反射在我们实际工作中会真正遇到吗

举一个例子,你做了一个项目,现在项目正在部署上线,但发现还有些细节部分需要调整,但这时候如果去修改源代码的化,就来不及了,如果修改源代码还要二次测试。因此我们只在配置文件中添加一些修改,这里就具体使用到反射。

相关推荐
曹牧1 分钟前
在 Eclipse 中配置 Maven 和 Gradle 项目以支持增量打包
java·eclipse·maven
lsx2024063 分钟前
XSLT `<sort>` 元素详解
开发语言
_olone4 分钟前
牛客每日一题:显生之宙(Java)
java·开发语言·算法·牛客
Sirens.6 分钟前
Java 包装类、泛型与类型擦除
java·开发语言·javac
小光学长22 分钟前
基于ssm的膳食健康管理系统e6whl4q7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·开发语言·数据库·学习·ssm
java1234_小锋23 分钟前
Java高频面试题:Redis到底支不支持事务啊?
java·redis·面试
无心水26 分钟前
【常见错误】2、Java并发编程避坑指南:从加锁失效到死锁,10个案例教你正确使用锁
java·开发语言·python
我爱学习好爱好爱27 分钟前
Kubernetes 1.29集群上部署Java网站项目
java·容器·kubernetes
青衫码上行27 分钟前
【项目开发日记 | Java架构】第一天
java·开发语言·spring cloud
至为芯32 分钟前
IP2075_34S至为芯支持C口快充的30W功率AC/DC芯片
c语言·开发语言