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的参数个数和类型问题相关推荐

  1. Python中使用jpype调用Jar包中的方法

    安装 pip install jpype1(注意要加后边这个1) 使用 基本流程如下: 使用jpype开启jvm 加载java类 调用java方法 关闭jvm 说明 我这里是在Python中使用Jav ...

  2. 为什么明明配置了jar包,main 方法还是 java.lang.NoClassDefFoundError ?

    一,原因 虽然你配置了jar包,但jar的作用范围没有放开! 如 IDEA 加入 tomcat 6.0.9 默认就Provied 二,解决方法 更改一下 jar包scope作用域就OK 三,什么是sc ...

  3. Windows下的Matlab与Java的混合编程,Java调用matlab编译的jar包(linux下请看我另外版本!)

    近来因为甲方需要做拟合等功能,需要用到matlab软件,并将其功能在java中实现,然后在服务器上也要实现,因为之前根本没有听说过,所以我苦心泣血,狂干一星期找到了,踩了无数个坑,终于实现了,因此想分 ...

  4. java jar包资源文件_深入jar包:从jar包中读取资源文件

    我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看 ...

  5. android 生成aar/jar包包含第三方jar包没有第三方jar包怎么办

    前言 最近需要写一个功能包,提供给界面去使用.里面涉及到一个第三方的包,这时候我生成aar/jar包给对方使用的时候,调用不到第三方包的代码,只可以调用我写的类的代码. 问题 我就去网上去寻找,aar ...

  6. Web项目替换jar包中的文件的方法

    经常遇到这样的问题,需要修改jar包中的方法.应该如何做? 1.有些很人性化的框架jar包,比如SpringSecurity,可以修改配置文件指定一个新建的类,让类实现Jar包中的对应的接口就好了. ...

  7. java生成jar包时使第三方jar_IEDA生成可运行jar包(包含第三方jar包)的方法

    最近现网需要处理一下数据,来适配一个场景.安排我来编写一个脚本来实现,由于步骤比较多,且需要调用其他服务接口,使用shell脚本来实现比较困难,所以想到了使用shell脚本调用java可执行jar包的 ...

  8. java生成cmd jar包_Java程序运行机制及cmd编译运行探究(二) cmd编译运行Java程序并打成jar包...

    目标:写一个RandomUtils.java工具类,返回一个随机数,并把这个类的字节码文件打成jar包 在Java运行机制及cmd编译运行探究(一)准备工作一文中,我总结了一部分要用到的cmd及编译运 ...

  9. java jar metainf_java – 从生成的jar文件中排除META-INF / maven文件夹

    我正在尝试创建一个jar文件,其中包含jar中提取的所有必需类.但对于像 log4j这样的少量依赖jar,它会在META-INF / maven / *中创建一些文件夹.我有一个限制,我将放置生成的j ...

  10. java 运行 加载jar,java运行时加载额外的 jar 包或 class

    首先讲下java类加载的顺序 每个类加载器有自己的名字空间,对于同一个类加载器实例来说,名字相同的类只能存在一个,并且仅加载一次.不管该类有没有变化,下次再需要加载时,它只是从自己的缓存中直接返回已经 ...

最新文章

  1. 一天 用户旅程_439天的旅程改变了我的生活
  2. 用TensorFlow实现的Mask R-CNN在人体语义分割上的效果
  3. iBatis 配置文件详解
  4. 【Android】EditText的一个问题
  5. 计算机硬件常见问题及修复,pc机输入输出设备的常见故障现象及故障修复方法...
  6. Tomcat连接池配置
  7. Django运维后台的搭建之二:建立template和对应的ModelForm
  8. 581. 最短无序连续子数组
  9. oracle中$的用法,关于expdp 中query用法小结
  10. Oracle数据库用法汇总
  11. 解决win-server 2008R2 安装 Materials 出现 Windows Install Coordinator “应用程序正在为首次安装做准备”...
  12. mysql的字段为bit时,插入数据报Data too long
  13. Python网络编程、爬虫之requests模块使用
  14. android应用程序在哪找,找不到应用程序的错误android
  15. 教师使用计算机的能力提升,河南省中小学教师信息技术应用能力提升工程实效研究...
  16. Java第32课——求数组元素最大值
  17. 如何用python制作3d游戏_【教程】12个步骤让你快速学会制作3D游戏
  18. mac|我在Android studio踩过的乌龙坑
  19. 1665. 计算数字
  20. hive 任务查询报错 Reduce operator initialization failed

热门文章

  1. POST形式 soapUI调用WebService的restful接口,传入json参数,并且返回json
  2. RedHat 7配置KVM和桥接
  3. 《maven实战》学习笔记2——maven安装(windows和eclipse插件)
  4. Reinvent the Wheel Often
  5. VS2010 配置PCL1.6.0AII in one 无法启动程序ALL_BUILD
  6. 《WinForm开发系列之控件篇》Item65 VScrollBar (暂无)
  7. SpringBoot 房屋租赁系统3.0 manland.liuyanzhao.com
  8. stm32 整数加法循环时间_剑指 Offer 65. 不用加减乘除做加法 leetcode 剑指offer系列...
  9. 在Linux下如何安装Jupyter Notebook
  10. python 日历热力图_Python如何绘制日历图和热力图