Java加载jar⽂件并调⽤jar⽂件当中有参数和返回值的⽅法
在⼯作当中经常遇到反编译后的jar⽂件,并要传⼊参数了解其中的某些⽅法的输出,想到⾥⾯的反射可以实现加载jar⽂件并调⽤其中的⽅法来达到⾃⼰的⽬的。就写了个Demo代码。
以下的类可以编译⽣成hello.jar⽂件。
1package org.lele.fatpanda;
2
3public class Util
4 {
5public static String myName;
6/*
7    * ⽆参数,⽆返回值的⽅法。
8*/
9public static void getVersion()
10    {
11        System.out.println("java version: " + Property("java.version") );
12    }
13/*
14    *有参数,⽆返回值的⽅法。
15*/
16public 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*/
24public static String getName(String prefix)
25    {
26return prefix + "lele";
27    }
28/*
29    * 多个参数,有返回值的⽅法。
30*/
31public static String test(String i1, int i2)
32    {
33return i1 + i2;
34    }
35
36 }
37/*
38 * ⼀个⽣成jar⽂件的类⽂件,要使⽤public的访问权限,如果在⽅便进⾏反射调⽤,则要将⽅法声明为static。
39*/
下⾯的就是实现动态加载并调⽤的主要代码。
1package com.xiyoulele.wh;
2
3import java.io.File;
4import flect.Method;
5import java.URL;
6import java.URLClassLoader;
7
8public class Main
9 {
10public static void main(String[] args)
11    {
12        URL[] urls = new URL[] {};
13        MyClassLoader classLoader = new MyClassLoader(urls, null);  //⾃定义ClassLoader来加载jar⽂件
14
15try
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 =  Method("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;
springframework jar包导入
39
40            Object[] ObjsB = new Object[2];
41            ObjsB[0] = new String("ZT");
42            ObjsB[1] = new Integer(520);
43
44            Method newMethod = Method("test", typesB);
45            String res = newMethod.wInstance(), 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 = Method("setTmpName", typesC);
57            methodC.wInstance(), objsC);
58
59//⽆参数,⽆返回值
60            Method methodD = DeclaredMethod("getVersion");
61            methodD.wInstance());
62
63            classLoader.close();  //关闭类的加载器
64
65        } catch (Exception e)
66        {
67            e.printStackTrace();
68        }
69    }
70//继承URLClassLoader来实现对jar⽂件的加载
71static class MyClassLoader extends URLClassLoader
72    {
73public MyClassLoader(URL[] urls)
74        {
75super(urls);
76        }
77public MyClassLoader(URL[] urls, ClassLoader parent)
78        {
79super(urls, parent);
80        }
81public void addJar(URL url)
82        {
83this.addURL(url);
84        }
85    }
86 }
87/*
88 * 需求:加载jar⽂件,动态调⽤⾥⾯的⽅法,该⽅法带有参数和返回值。
89*/
程序运⾏的结果:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。