1.思路概述
要实现上传matlab生成的jar包,添加描述“类名”与“方法名”,实现通过反射调用方法的功能。想法是准备将描述添加到数据库中,调用时从数据库获取类名与方法名,再进行调用。
2.实施
2.1获取运行时类
网上有很多获取jar包中运行时类的办法,这里不一一列举,直接贴上代码。
File file = new File("C:/Users/Administrator/Desktop/plotTest/for_redistribution_files_only/plotTest.jar");//jar包的路径
URL url = file.toURI().toURL();
URLClassLoader loader = new URLClassLoader(new URL[]{url});//创建类加载器
Class<?> cls = loader.loadClass("plotTest.PlotClass");//加载指定类,注意一定要带上类的包名
看见其代码注释上说,一定要带上类的包名,包名!!!!!
2.1.1问题1
像这样,将jar包直接放至工程下,是不是就没有包名了???我试着直接写类的名字
P
l
o
t
C
l
a
s
s
PlotClass
PlotClass,结果发现果然找不到jar包,那么这个matlab生成的jar包的包名在哪里???
直到我点开
发现了!包名就是plotTest!!!!
2.2获取方法
接下来要获取类的方法了,在自己测试的时候,就是一个简单的画图方法,没有参数。
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
PlotClass p=new PlotClass();
System.out.println();
p.plotTest();
}
2.2.1问题一
但是,遇到了第一个问题----找不到plotTest方法????
之前调用的时候plotTest()是没有参数的,且能调用成功。
但是反射写成
报错了
等我细细的看看getDeclaredMethods()这个方法,为了确定方法的唯一性,防止方法的重载而找到的方法不唯一,getDeclaredMethods()不仅要传入方法名,还要传入参数的运行时类,那么那个方法真的是无参的吗?
首先,我写了一个测试类,鼠标放在上面
可达鸭眉头一皱,发现事情并不简单。这个Object… arg0是什么参数?
忽然拍脑想起,运行时类是可以获取方法的,运行代码
Method[] m2=cls.getDeclaredMethods();
for(Method m:m2){
System.out.println(m);
}
结果大出所料,竟然有这么多方法,我当初在matlab就定义了一个函数呀。
和当初测试类一结合,我发现自己调用的方法应该是public void plotTest.PlotClass.plotTest(java.lang.Object[],java.lang.object[]) throw exception,输入参数,找到方法了。
2.2.2问题二
但是调用的时候又出现了问题,代码
Method m1=cls.getDeclaredMethod("plotTest",Object[].class,Object[].class);
System.out.println(cls);//输出"000chen000","chen"字符串两边各加3个"0"字符串
Object obj=cls.newInstance();
m1.setAccessible(true);
m1.invoke(obj);
意思是invoke的参数和你前面Method的参数不匹配,那么问题来了,怎么输入匹配的参数呢????这是一个无参的方法呀。
试着传入null,报空指针错误
参考网上的解答,发现参数需要改成
调用成功。
完整的代码
import java.io.File;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import com.mathworks.toolbox.javabuilder.MWException;
public class MyClassLoader {
public static void main(String[] args) throws Exception {
File file = new File("C:/Users/Administrator/Desktop/plotTest/for_redistribution_files_only/plotTest.jar");//jar包的路径
URL url = file.toURI().toURL();
URLClassLoader loader = new URLClassLoader(new URL[]{url});//创建类加载器
Class<?> cls = loader.loadClass("plotTest.PlotClass");//加载指定类,注意一定要带上类的包名
Method[] m2=cls.getDeclaredMethods();
for(Method m:m2){
System.out.println(m);
}
Object[] a={},b={2};
Method m1=cls.getDeclaredMethod("plotTest",Object[].class);
System.out.println(cls);//输出"000chen000","chen"字符串两边各加3个"0"字符串
Object obj=cls.newInstance();
m1.setAccessible(true);
m1.invoke(obj,(Object)a);
}
}
如果有问题的话,希望留言,一起探讨交流。
3.参考:
https://blog.csdn.net/lw_zj_ywn/article/details/86512301
https://redarmychen.iteye.com/blog/924134
开心一下^ _ ^