上一篇实现了反射调用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包
生成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;
}
}
测试结果如下
如此实现jar包反射调用和jar包引用,通过类实现引用包的接口,通过反射得到对象转换成接口达到调用多态,和C#自己生成dll,其他工程引用dll,反射得到接口实现一样。第二个技术积累点完成。