java通过反射调用matlab生成的jar包中的方法(1)--java调用matlab的参数个数和类型问题
java通过反射调用matlab生成的jar包中的方法(1)
- 1.思路概述
- 2.实施
- 2.1获取运行时类
- 2.1.1问题1
- 2.2获取方法
- 2.2.1问题一
- 2.2.2问题二
- 3.参考:
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包直接放至工程下,是不是就没有包名了???我试着直接写类的名字PlotClassPlotClassPlotClass,结果发现果然找不到jar包,那么这个matlab生成的jar包的包名在哪里???
直到我点开
发现了!包名就是plotTest!!!!
2.2获取方法
接下来要获取类的方法了,在自己测试的时候,就是一个简单的画图方法,没有参数。
public static void main(String[] args) throws Exception {// TODO Auto-generated method stubPlotClass 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
开心一下^ _ ^
java通过反射调用matlab生成的jar包中的方法(1)--java调用matlab的参数个数和类型问题相关推荐
- Python中使用jpype调用Jar包中的方法
安装 pip install jpype1(注意要加后边这个1) 使用 基本流程如下: 使用jpype开启jvm 加载java类 调用java方法 关闭jvm 说明 我这里是在Python中使用Jav ...
- 为什么明明配置了jar包,main 方法还是 java.lang.NoClassDefFoundError ?
一,原因 虽然你配置了jar包,但jar的作用范围没有放开! 如 IDEA 加入 tomcat 6.0.9 默认就Provied 二,解决方法 更改一下 jar包scope作用域就OK 三,什么是sc ...
- Windows下的Matlab与Java的混合编程,Java调用matlab编译的jar包(linux下请看我另外版本!)
近来因为甲方需要做拟合等功能,需要用到matlab软件,并将其功能在java中实现,然后在服务器上也要实现,因为之前根本没有听说过,所以我苦心泣血,狂干一星期找到了,踩了无数个坑,终于实现了,因此想分 ...
- java jar包资源文件_深入jar包:从jar包中读取资源文件
我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看 ...
- android 生成aar/jar包包含第三方jar包没有第三方jar包怎么办
前言 最近需要写一个功能包,提供给界面去使用.里面涉及到一个第三方的包,这时候我生成aar/jar包给对方使用的时候,调用不到第三方包的代码,只可以调用我写的类的代码. 问题 我就去网上去寻找,aar ...
- Web项目替换jar包中的文件的方法
经常遇到这样的问题,需要修改jar包中的方法.应该如何做? 1.有些很人性化的框架jar包,比如SpringSecurity,可以修改配置文件指定一个新建的类,让类实现Jar包中的对应的接口就好了. ...
- java生成jar包时使第三方jar_IEDA生成可运行jar包(包含第三方jar包)的方法
最近现网需要处理一下数据,来适配一个场景.安排我来编写一个脚本来实现,由于步骤比较多,且需要调用其他服务接口,使用shell脚本来实现比较困难,所以想到了使用shell脚本调用java可执行jar包的 ...
- java生成cmd jar包_Java程序运行机制及cmd编译运行探究(二) cmd编译运行Java程序并打成jar包...
目标:写一个RandomUtils.java工具类,返回一个随机数,并把这个类的字节码文件打成jar包 在Java运行机制及cmd编译运行探究(一)准备工作一文中,我总结了一部分要用到的cmd及编译运 ...
- java jar metainf_java – 从生成的jar文件中排除META-INF / maven文件夹
我正在尝试创建一个jar文件,其中包含jar中提取的所有必需类.但对于像 log4j这样的少量依赖jar,它会在META-INF / maven / *中创建一些文件夹.我有一个限制,我将放置生成的j ...
- java 运行 加载jar,java运行时加载额外的 jar 包或 class
首先讲下java类加载的顺序 每个类加载器有自己的名字空间,对于同一个类加载器实例来说,名字相同的类只能存在一个,并且仅加载一次.不管该类有没有变化,下次再需要加载时,它只是从自己的缓存中直接返回已经 ...
最新文章
- 一天 用户旅程_439天的旅程改变了我的生活
- 用TensorFlow实现的Mask R-CNN在人体语义分割上的效果
- iBatis 配置文件详解
- 【Android】EditText的一个问题
- 计算机硬件常见问题及修复,pc机输入输出设备的常见故障现象及故障修复方法...
- Tomcat连接池配置
- Django运维后台的搭建之二:建立template和对应的ModelForm
- 581. 最短无序连续子数组
- oracle中$的用法,关于expdp 中query用法小结
- Oracle数据库用法汇总
- 解决win-server 2008R2 安装 Materials 出现 Windows Install Coordinator “应用程序正在为首次安装做准备”...
- mysql的字段为bit时,插入数据报Data too long
- Python网络编程、爬虫之requests模块使用
- android应用程序在哪找,找不到应用程序的错误android
- 教师使用计算机的能力提升,河南省中小学教师信息技术应用能力提升工程实效研究...
- Java第32课——求数组元素最大值
- 如何用python制作3d游戏_【教程】12个步骤让你快速学会制作3D游戏
- mac|我在Android studio踩过的乌龙坑
- 1665. 计算数字
- hive 任务查询报错 Reduce operator initialization failed
热门文章
- POST形式 soapUI调用WebService的restful接口,传入json参数,并且返回json
- RedHat 7配置KVM和桥接
- 《maven实战》学习笔记2——maven安装(windows和eclipse插件)
- Reinvent the Wheel Often
- VS2010 配置PCL1.6.0AII in one 无法启动程序ALL_BUILD
- 《WinForm开发系列之控件篇》Item65 VScrollBar (暂无)
- SpringBoot 房屋租赁系统3.0 manland.liuyanzhao.com
- stm32 整数加法循环时间_剑指 Offer 65. 不用加减乘除做加法 leetcode 剑指offer系列...
- 在Linux下如何安装Jupyter Notebook
- python 日历热力图_Python如何绘制日历图和热力图