• Java反射调用jar包实现多态


    上一篇实现了反射调用jar包,但是没有实现多态,这次先给自己的jar包类抽象一个接口,然后实现类实现接口。最后调用放反射得到的对像转换成接口类型调用执行。

    定义接口,指定包为ZLZJar

    package ZLZJar;
    
    public interface ITest {
        public String Invoke(String para);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    实现接口方法

    package ZLZJar;
    
    public class Test implements ITest {
        //加两个证书
        public int Add(int a,int b) {
            return a+b;
        }
    
        //说你好
        public void Hello() {
            System.out.println("Hello My Name Is Lite Gray Fish");
        }
    
        //执行方法
        public String Invoke(String para)
        {
            System.out.println("你传入的参数是:"+para);
            return  "你传入的参数是:"+para;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    生成jar包
    在这里插入图片描述
    生成jar包指定id和版本,引用要一致
    在这里插入图片描述

    把jar包拷贝到调用方工程下新建的libs文件夹
    在这里插入图片描述
    调用工程里面加入maven本地引用
    在这里插入图片描述

    调用测试代码

    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;
    import ZLZJar.*;
    
    //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("ZLZJar.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);
                //转换成接口,这个很重要,后面的实现类都实现特定接口,通过反射得到对象调用,实现多态和动态调用
                ITest it=(ITest)o;
                //接口调用
                it.Invoke("zlz调用传入的参数");
    
            } 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
    • 70
    • 71
    • 72
    • 73
    • 74

    测试结果如下
    在这里插入图片描述

    如此实现jar包反射调用和jar包引用,通过类实现引用包的接口,通过反射得到对象转换成接口达到调用多态,和C#自己生成dll,其他工程引用dll,反射得到接口实现一样。第二个技术积累点完成。

  • 相关阅读:
    Win11安装权限在哪里设置?Win11安装权限设置的方法
    电脑怎么图片转文字?建议收藏这几个方法
    2024.4.6学习笔记
    机器学习——聚类算法
    3.Linux传统性能检测工具——vmstat
    Vscode | Python | launch.json配置gevent多进程断点失效问题处理
    CA周记 2022年的第一课 - Rust
    深挖Cerebras:世界上最大AI芯片的架构设计
    IDEA下载安装
    Win10 基于Docker使用tensorflow serving部署模型
  • 原文地址:https://blog.csdn.net/zhanglianzhu_91/article/details/133880882