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

输出jar包的工程设置
Java反射调用jar包_第1张图片

生成jar包
Java反射调用jar包_第2张图片

然后创建一个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;
    }

}

运行如下
Java反射调用jar包_第3张图片

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

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