Java反射调用jar包实现多态

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

定义接口,指定包为ZLZJar

package ZLZJar;

public interface ITest {
    public String Invoke(String para);
}

实现接口方法

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;
    }
}

生成jar包
Java反射调用jar包实现多态_第1张图片
生成jar包指定id和版本,引用要一致
Java反射调用jar包实现多态_第2张图片

把jar包拷贝到调用方工程下新建的libs文件夹
Java反射调用jar包实现多态_第3张图片
调用工程里面加入maven本地引用
Java反射调用jar包实现多态_第4张图片

调用测试代码

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;
    }

}

测试结果如下
Java反射调用jar包实现多态_第5张图片

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

你可能感兴趣的:(java,jar,python)