文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么在Java中利用反射调用jar包中的类

2023-06-14 10:37

关注

怎么在Java中利用反射调用jar包中的类?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

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

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的这一机制。

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

代码具体

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"      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"字符串 }}

看完上述内容,你们掌握怎么在Java中利用反射调用jar包中的类的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯