求E语言通过java支持库调用jar包时参数传递教程

求E语言通过java支持库调用jar包时参数传递教程,第1张

Java加载jar文件并调用jar文件当中有参数和返回值的方法

在工作当中经常遇到反编译后的jar文件,并要传入参数了解其中的某些方法的输出,想到Java里面的反射可以实现加载jar文件并调用其中的方法来达到自己的目的。就写了个Demo代码。

以下的类可以编译生成hello.jar文件。

1 package org.lele.fatpanda

2    3 public class Util

4 {

5     public static String myName

6     /*  7      * 无参数,无返回值的方法。

8      */   9     public static void getVersion()  

10     {  

11         System.out.println("java version: " + System.getProperty("java.version") ) 

12     }  

13     /* 14      *有参数,无返回值的方法。

15      */  16     public static void setTmpName(String name)  

17     {  

18         myName = name 

19         System.out.println("Set Tmp Name Succeed and the name is : " + myName) 

20     }  

21     /* 22      * 单个参数,有返回值的方法。

23      */  24     public static String getName(String prefix)  

25     {  

26         return prefix + "lele" 

27     }  

28     /* 29      * 多个参数,有返回值的方法。

30      */  31     public static String test(String i1, int i2)  

32     {  

33         return i1 + i2     

34     }  握仿

35       36 }  

37 /* 38  * 一个生成jar文件的类文件,要使用public的访问权限,如果在方便进行反射调用,则要将方法声明为static。

39  */  

下面的就是实现动态加载并调用的主要代码。

1 package com.xiyoulele.wh

2    3 import java.io.File

4 import java.lang.reflect.Method

5 import java.net.URL

6 import java.net.URLClassLoader

7    8 public class Main

9 {  

10     public static void main(String[] args)  

11     {  

12         URL[] urls = new URL[] {} 

13         MyClassLoader classLoader = new MyClassLoader(urls, null) //自定义ClassLoader来加载jar文件  14           15         try   16  派山       {  

17             classLoader.addJar(new File("c:\\hello.jar").toURI().toURL()) //加载特定路径的jar文件  18             Class<?>clazz = classLoader.loadClass("org.lele.fatpanda.Util")//动态加载jar文件当中的特定类的class文件    

19               20             //传入一个参数一个段羡纤返回值  21           22             Class<?>[] typeA = new Class[1] //传入要调用的方法的参数类型  23             typeA[0] = String.class 

24               25             Object[] objsA = new Object[1] //传入要调用的方法的具体参数  26             objsA[0] = new String("xiyou") 

27               28             Method method =  clazz.getMethod("getName", typeA) //获取要被调用的特定方法  getName(String xx)  29               30             String result = method.invoke(clazz, objsA).toString()//调用方法,获取方法的返回值。  31               32             System.out.println(result) //输出方法      

33               34             //传入2个参数一个人返回值  35               36             Class<?>[] typesB = new Class[2] 

37             typesB[0] = String.class 

38             typesB[1] = Integer.TYPE 

39               40             Object[] ObjsB = new Object[2] 

41             ObjsB[0] = new String("ZT") 

42             ObjsB[1] = new Integer(520) 

43               44             Method newMethod = clazz.getMethod("test", typesB) 

45             String res = newMethod.invoke(clazz.newInstance(), ObjsB).toString() 

46               47             System.out.println(res) 

48               49             //有传入的参数,没有返回值  50             Class<?>[] typesC = new Class[1] 

51             typesC[0] = String.class 

52               53             Object[] objsC = new Object[1] 

54             objsC[0] = new String("xiyoulele") 

55               56             Method methodC = clazz.getMethod("setTmpName", typesC) 

57             methodC.invoke(clazz.newInstance(), objsC) 

58               59             //无参数,无返回值  60             Method methodD = clazz.getDeclaredMethod("getVersion") 

61             methodD.invoke(clazz.newInstance())               

62               63             classLoader.close() //关闭类的加载器  64               65         } catch (Exception e)  

66         {            

67             e.printStackTrace() 

68         }  

69     }    

70     //继承URLClassLoader来实现对jar文件的加载  71     static class MyClassLoader extends URLClassLoader  

72     {  

73         public MyClassLoader(URL[] urls)  

74         {  

75             super(urls) 

76         }  

77         public MyClassLoader(URL[] urls, ClassLoader parent)  

78         {  

79             super(urls, parent) 

80         }  

81         public void addJar(URL url)  

82         {  

83             this.addURL(url) 

84         }  

85     }  

86 }  

87 /* 88  * 需求:加载jar文件,动态调用里面的方法,该方法带有参数和返回值。

89  */

程序运行的结果:

Set db = CreateObject("陆知谈DBSoft.DBSoft_Msgbox"早碰)

a = db.MessageBoxSelfA("大兵提示"猛厅, "请选择你的年龄", array(1, 2, 3, 4, 5, 6)

这样吧给你解释一下意蔽肆裤思

public class Test { //某一个类,可以理解为窗口程序集1,

public static void main(String[] args) { //程序入口,可以理解成_启动窗口创建完毕

//str为参与校验的字符串

//检宏简验和的概念一般体现在8bit长度的字符数组

//下面使用的字符串全为ASCII码

String str="GPGGA,075935.000,2435.8682,N" //命名一个字符串变量,并且赋值,在易语言中即变量1=“GPGGA,075935.000,2435.8682,N”,其中变量1为文本型变量。

//和校验是异或运算,需要先强制把雹芹字符转换成整形数据

char ch=str.charAt(0)

int x=(int)ch

int y

for(int i=1i<str.length()i++){

y=(int)str.charAt(i)

x=x^y

}

//x即为校验和,下面将其转换成十六进制形式

String check=Integer.toHexString(x)

}

//就是将它后面这一段不好翻译,就是分割文本(变量1,“,”)然后用循环将它转换成16进制,在易语言中为十到十六(变量1[i])

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8273730.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存