反射作为托管语言的特性,很多框架都依赖反射来实现容器和面向接口编程,对架构程序很重要,首先试验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包的工程设置
 
生成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;
    }
}
运行如下
 
基于反射和接口加上调用编译命令实现动态调用和业务脚本化,积累框架技术点一个,合适自己的就是最好的



















