服务器之家

服务器之家 > 正文

Java 使用反射调用jar包中的类方式

时间:2021-09-02 12:30     来源/作者:Mascot_Wu

下面讲展示的是从image.jar包中调用image.Buddy类的方法。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Main {
    public static void main(String[] args) {
        try {
 
//          两种方式都可以
            URL url = new File("/Users/wuchen/Documents/IntelliJIDEA/Applet/out/production/Applet/image.jar").toURI().toURL();
//          URL url = new URL("file:/Users/wuchen/Documents/IntelliJIDEA/Applet/out/production/Applet/image.jar");
            URL[] urls = new URL[]{ url };
            URLClassLoader loader = new URLClassLoader(urls);
            Class c = loader.loadClass("image.Buddy");
            Object o = c.newInstance();
            Method m = c.getMethod("sleep");
            m.invoke(o);
 
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
}

有几点需要注意

第一:

URL 是 "file:/Users/wuchen/Documents/IntelliJIDEA/Applet/out/production/Applet/image.jar"

image.jar后面没有斜杠了

第二:

类名是 image.Buddy,不要因为URL里面有image就把image.Buddy中的image省略掉。

第三:

Buddy.class应该放在image文件夹内,然后打包image文件夹,而不是打包image文件夹里的所有文件,再把包名改成image.jar

补充:java动态载入指定的类或者jar包反射调用其方法

序言

有时候。项目中会用到java动态载入指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大减少,更加的模块化。代码利用率更高。模式中的代理模式就用到java的这一机制。

下边就让我们通过代码来看看怎样实现此功能。

代码具体

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package loadjarclass;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import org.junit.Test;
public class LoadJarClassTest {
 
 @Test
 public void testLoadClass() throws Exception{
  /*动态载入指定类*/
  File file=new File("D:/test");//类路径(包文件上一层)
  URL url=file.toURI().toURL();
  ClassLoader loader=new URLClassLoader(new URL[]{url});//创建类载入器
  //import com.sun.org.apache.bcel.internal.util.ClassLoader;
  //ClassLoader classLoader = new ClassLoader(new String[]{""});//类路径
  Class<?> cls=loader.loadClass("loadjarclass.TestTest");//载入指定类。注意一定要带上类的包名
  Object obj=cls.newInstance();//初始化一个实例
  Method method=cls.getMethod("printString",String.class,String.class);//方法名和相应的參数类型
  Object o=method.invoke(obj,"chen","leixing");//调用得到的上边的方法method
  System.out.println(String.valueOf(o));//输出"chenleixing"
  
  /*动态载入指定jar包调用当中某个类的方法*/
  file=new File("D:/test/commons-lang3.jar");//jar包的路径
  url=file.toURI().toURL();
  loader=new URLClassLoader(new URL[]{url});//创建类载入器
  cls=loader.loadClass("org.apache.commons.lang3.StringUtils");//载入指定类,注意一定要带上类的包名
  method=cls.getMethod("center",String.class,int.class,String.class);//方法名和相应的各个參数的类型
  o=method.invoke(null,"chen",Integer.valueOf(10),"0");//调用得到的上边的方法method(静态方法,第一个參数能够为null)
  System.out.println(String.valueOf(o));//输出"000chen000","chen"字符串两边各加3个"0"字符串
 }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。

原文链接:https://blog.csdn.net/sinat_16492463/article/details/44853849

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部