java通过反射调用matlab生成的jar包中的方法(1)--java调用matlab的参数个数和类型问题

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
开心一下^ _ ^
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值