一、首先我们编写一个需要达成jar包的测试类,代码如下所示
下面上完整代码
package com.test.demo;
public class Demo2 {
public String getHello(String str){
return "hello:"+str;
}
public String getHello1(String str){
return "hello1:"+str;
}
}
测试代码中包含了两个方法,getHello,getHello1里面方法均需要传入参数,并且均有返回值
如图所示,我们将上述的代码打包成为一个名为Demo2.jar的文件,然后我们将这个文件在需要调用的工程的目录中,本示例中我是讲起加在了工程的lib目录中,注意此处并不需要build path进入工程,只需要将文件拷贝在你想要的目录中
String jar_path="file:./lib/Demo2.jar";
String class_path="com.test.demo.Demo2";
然后我们新建一个类用来测试调用jar包,在代码中我们声明了两个变量,分别是jar文件的路径,(此处为文件类型的路径即以file:开头,接下来的文件路径可以是相对路径也可以是绝对路径),还有一个class所在的路径,需要带包名,如果在default包中则直接为类名即可(个人建议不要使用default包,容易出各种想象不到的问题)
ClassLoader cl = new URLClassLoader(new URL[]{ new URL(jar_path)});//从jar包中加载类加载器
Class<?> c = cl.loadClass(class_path);//从类加载器中加载类
Method[] methods = c.getDeclaredMethods();//从类中加载方法
method.invoke(c.newInstance(),"1");//调用类中的方法,此处需要注意当jar包中方法不是static方法时,需要使用c.newInstance()方法实例化一个对象出来
下面上完整代码
package com.test.demo;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class DemoMain {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String jar_path="file:./lib/Demo2.jar";
String class_path="com.test.demo.Demo2";
try {
ClassLoader cl = new URLClassLoader(new URL[]{ new URL(jar_path)});
Class<?> c = cl.loadClass(class_path);
Method[] methods = c.getDeclaredMethods();
for(Method method:methods){
System.out.println(method.getName());
System.out.println(method.invoke(c.newInstance(),"1"));
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果如下所示:
getHello
hello:1
getHello1
hello1:1