• Java反射调用jar包


    反射作为托管语言的特性,很多框架都依赖反射来实现容器和面向接口编程,对架构程序很重要,首先试验Java的反射部分。

    首先创建一个ZLZJar的工程,让他打包成jar包,代码如下

    public class Test {
        //加两个整数
        public int Add(int a,int b) {
            return a+b;
        }
    
        //说你好
        public void Hello() {
            System.out.println("Hello My Name Is Lite Gray Fish");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    输出jar包的工程设置
    在这里插入图片描述

    生成jar包
    在这里插入图片描述

    然后创建一个ZLZTestJar工程测试jar包反射调用,代码如下

    import java.io.File;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLClassLoader;
    import java.lang.Class;
    import java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.jar.JarFile;
    import java.util.jar.JarEntry;
    
    //zlz练习
    public class Main {
    
        //m主方法
        public static void main(String[] args) {
            try {
                //自己生成jar包路径
                URL url = new File("D:\\ZLZJar\\out\\artifacts\\ZLZJar\\ZLZJar.jar").toURI().toURL();
                URL[] urls = new URL[]{ url };
                //加载程序集
                URLClassLoader loader = new URLClassLoader(urls);
                //加载类
                Class c = loader.loadClass("Test");
                //创建对象
                Object o = c.newInstance();
                //得到方法
                Method m = c.getMethod("Hello");
                //执行
                m.invoke(o);
                //有参数的方法通过名称无法得到,自己包装一下
                //Method mAdd = c.getMethod("Add");
                Method mAdd = GetMethod(c,"Add");
                Object ret=mAdd.invoke(o,1,2);
                System.out.println("求和结果:"+ret);
    
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    
        //通过类型和名称得到方法
        public static Method  GetMethod(Class c,String name) {
            Method[] methods = c.getMethods();
    
            for (Method method : methods) {
                System.out.println("类名:"+method.getName().intern());
                if (method.getName().intern()==name) {
    
                    return method;
    
                }
            }
            return  null;
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    运行如下
    在这里插入图片描述

    基于反射和接口加上调用编译命令实现动态调用和业务脚本化,积累框架技术点一个,合适自己的就是最好的

  • 相关阅读:
    Linux---进程/磁盘管理
    【PowerQuery】Excel 自动刷新PowerQuery连接
    栈实现计算器
    PAM从入门到精通(十九)
    R语言结构方程模型(SEM)在生态学领域中的实践应用
    中国电信研究院发布《5G+数字孪生赋能城市数字化应用研究报告》
    mingw-w64安装
    [数据集][目标检测]犀牛数据集VOC+yolo格式376张1类别
    【语言学习】std::transform函数
    “语法糖”——我的编程新知
  • 原文地址:https://blog.csdn.net/zhanglianzhu_91/article/details/133845746