当前位置: 首页 > news >正文

通过反射写个“框架”

首先准备配置文件

className=com.yunji.test.Person
methodName=eat

在这里插入图片描述
准备两个类
Person类

package com.yunji.test;/*
 @Author wanghongyuan
  @Date 2021/1/22 
 
*/

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public void eat(){
        System.out.println("eat.....");
    }

}

Student类

package com.yunji.test;/*
 @Author wanghongyuan
  @Date 2021/1/25 
 
*/

public class Student {
    private String name;

    public Student() {
    }

    public Student(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                '}';
    }
    public void sleep(){
        System.out.println("睡觉。。。。");
    }
}

开始写执行方法

package com.yunji.test01;/*
 @Author wanghongyuan
  @Date 2021/1/25 
 
*/

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;

/*
    需求:写一个框架,前提是不改变代码的情况下,可以帮我们创建任意类对象,并且执行其中的任意方法
    实现:
        1.配置文件
        2.反射
    步骤:
        1.将需要创建的对象的全类名和需要执行的方法定义在配置文件中
        2.在程序中加载读取配置文件
        3.使用反射技术来加载类文件进内存
        4.创建对象
        5.执行方法
 */
public class ReflectTest {
    public static void main(String[] args) throws Exception {
        //1.加载配置文件
        //1.1创建Properties对象
        Properties pro = new Properties();
        //1.2通过对象中的load,加载配置文件,转换为一个集合。
        //1.2.1获取class目录下的配置文件,这样就获取了Reflect字节码文件,再调用其中的getClassloader方法,得到类加载器,由
        //这个类加载器,加载进内存
        ClassLoader classLoader = ReflectTest.class.getClassLoader();
        //获取字节流
        InputStream is = classLoader.getResourceAsStream("resources.properties");
        pro.load(is);

        //2.获取配置文件中定义的数据
        String className = pro.getProperty("className");
        String methodName = pro.getProperty("methodName");

        //3.加载该类进内存
        Class cls = Class.forName(className);
        //4.创建对象,加载谁就创建谁的对象
        Object obj = cls.newInstance();
        //5.获取方法对象
        Method method = cls.getMethod(methodName);
        //6.执行方法
        method.invoke(obj);
    }
}

这边要注意的是配置文件中的命名一定要规范,大小写输错了就会报错

connector-java-5.1.45.jar" com.yunji.test01.ReflectTest
Exception in thread "main" java.lang.NullPointerException
	at java.lang.Class.searchMethods(Class.java:3003)
	at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
	at java.lang.Class.getMethod0(Class.java:3018)
	at java.lang.Class.getMethod(Class.java:1784)
	at com.yunji.test01.ReflectTest.main(ReflectTest.java:46)

Process finished with exit code 1

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Postman中使用的参数
  • 注解(一)
  • 基于注解一个简单的测试框架
  • 数据库(一)
  • 数据库(二)
  • 数据库(三)
  • 数据库(四)
  • 数据库(五)
  • 数据库(六)
  • 数据库(七)
  • 0205
  • 数据库(八)
  • 数据库(九)
  • Httprunner使用指南
  • JDBC(一)
  • [译] 怎样写一个基础的编译器
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • express.js的介绍及使用
  • Java精华积累:初学者都应该搞懂的问题
  • JWT究竟是什么呢?
  • Linux各目录及每个目录的详细介绍
  • mysql常用命令汇总
  • PHP变量
  • SOFAMosn配置模型
  • Vue 动态创建 component
  • Vue2 SSR 的优化之旅
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 通信类
  • 智能合约开发环境搭建及Hello World合约
  • nb
  • 阿里云API、SDK和CLI应用实践方案
  • 组复制官方翻译九、Group Replication Technical Details
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (2.2w字)前端单元测试之Jest详解篇
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (3)llvm ir转换过程
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (55)MOS管专题--->(10)MOS管的封装
  • (C++20) consteval立即函数
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (十六)Flask之蓝图
  • (四)图像的%2线性拉伸
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .cfg\.dat\.mak(持续补充)
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net专家(高海东的专栏)
  • @angular/cli项目构建--http(2)
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构