当前位置: 首页 > 面试题库 >

动态加载Jar并实例化已加载类的对象

娄学文
2023-03-14
问题内容

我尝试将jar动态加载到Java项目中。

这是类加载器的代码:

public class ClassLoad {

public static void main(String[] args) {

    String filePath = new String("C:/Users/Mehdi/Desktop/JavaClassLoader/jarred.jar");

    URL myJarFile = null;
    try {
        myJarFile = new URL("file://"+filePath);
    } catch (MalformedURLException e1) {
        System.out.println("1");
        e1.printStackTrace();
    }

    URLClassLoader cl = URLClassLoader.newInstance(new URL[]{myJarFile});

    Class Jarred = null;
    try {
        Jarred = cl.loadClass("com.jarred.exp.Jarred");
    } catch (ClassNotFoundException e) {
        System.out.println("2");
        e.printStackTrace();
    }

    Method simpleWrite = null;
    try {
        simpleWrite = Jarred.getMethod("simpleWrite", new Class[] {String.class});
    } catch (SecurityException e) {
        System.out.println("3");
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        System.out.println("4");
        e.printStackTrace();
    }

    Object JarredObj = null;
    try {
        JarredObj = Jarred.newInstance();
    } catch (InstantiationException e) {
        System.out.println("5");
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        System.out.println("6");
        e.printStackTrace();
    }

    try {
        Object response = simpleWrite.invoke(JarredObj, "\nHello Mehdi ! It works hamdoulillah :D");
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
}
}

以及Jar中包含的Class:

package com.jarred.exp;

public class Jarred {

public void simpleWrite(String str) {
    System.out.println(str);
}

}

它给了我:

2
java.lang.ClassNotFoundException: com.jarred.exp.Jarred
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.net.FactoryURLClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at ClassLoad.main(ClassLoad.java:25)
Exception in thread "main" java.lang.NullPointerException
at ClassLoad.main(ClassLoad.java:32)

您对此有什么想法吗?谢谢。


问题答案:

您的文件网址似乎无效。

“ Windows中的文件URI”说

对于本地Windows文件路径

C:\Documents and Settings\davris\FileSchemeURIs.doc

Windows中相应的有效文件URI为:

file:///C:/Documents%20and%20Settings/davris/FileSchemeURIs.doc

这表明冒号后需要 三个斜杠 ,但是您要在其中计算的URL

String filePath = new String("C:/Users/Mehdi/Desktop/JavaClassLoader/jarred.jar");

URL myJarFile = null;
try {
    myJarFile = new URL("file://"+filePath);

在。之后仅有 两个斜线file:。也许

    myJarFile = new URL("file://"+filePath);

应该

    myJarFile = new URL("file:///"+filePath);

或者你也可以使用java.io.File.toURI这样

File myJarFile = new File("C:\\Users\\Mehdi\\Desktop\\JavaClassLoader\\jarred.jar");
if (!myJarFile.isFile()) {
  throw new FileNotFoundException("Missing required JAR: " + myJarFile.toString());
}
URL myJarUrl = myJarFile.toURI().toURL();

具有适当的异常处理。



 类似资料:
  • 问题内容: 我整天都在这个问题上。我的问题是如何在实例上进行MethodHandle.invokeExact调用,该实例的类类型在程序运行时动态加载。为了使问题更清楚,我在下面显示我的示例代码: 在此示例中,expClass是动态加载的,其类类型为。下一行的obj实例被声明为BaseTemplate,其真实类型为。类AddSample是BaseTemplate的子类。然后,向其添加函数创建了一个M

  • 问题内容: 请查看下面的修改 我正在尝试创建一个 JShell实例 ,该 实例 使我可以访问它,并让我与创建它的 JVM中的 对象进行交互。这对于在编译时可用的类很好,但对于 动态 加载的类却失败了。 另外,与交换可以得到相同的结果,但是我不理解两个类之间的区别。 如何使 运行时 加载的类可用于此 JShell实例 ? 编辑:此问题的第一部分已解决,下面是更新的源代码,以演示问题的第二部分 如果

  • 问题内容: 我查找了语法并搜索了api,但仍然对该过程感到困惑。我还搜索了Stackoverflow。加载类并从中动态创建对象的正确方法是什么?换句话说,我希望用户指定要创建的对象类型,然后创建该类型的对象。我不需要菜单,因为我希望他们能够选择当前目录中的任何类。 问题答案: 假设该类具有无参数构造函数,则最简单的方法是- 参考-java.lang.Class

  • 主要内容:确定网站类型,影片详情信息,影片总数量,影片类型与类型码,编写完整程序本节讲解如何抓取豆瓣电影“分类排行榜”中的电影数据( https://movie.douban.com/chart),比如输入“犯罪”则会输出所有犯罪影片的电影名称、评分,效果如下所示: 确定网站类型 首先要明确豆瓣电影网站的类型,即是动态还是静态。检查方法:右键查看网页源码 —> 搜索“辛德勒的名单”关键字,如下图所示: 图1:分析网站类型 最终发现源码页中没有出现想要抓取的数据,只有一大堆的

  • 问题内容: 我正在尝试在Android平台上的运行时动态加载类。该类包含在单独的库JAR文件中,但与APK打包在一起(按照SDK中的新库机制)。使用Class.forname方法时,我收到未找到的类异常。我已经看到了有关DexClassLoader方法的一些讨论,但是我找不到如何使用它的好例子(以及是否是最好的使用方法- 它似乎比forname方法复杂得多!)。 如果有人可以提供示例代码片段来说明

  • 问题内容: 我正在尝试为我的应用程序创建一个插件系统,我想从简单的事情开始。每个插件都应打包在.jar文件中并实现接口: 现在,我创建了一个打包为.jar的实现,并将其放在主应用程序的plugin /子目录中: 在主应用程序中,我想获取一个实例。我尝试了两种选择,都使用。 1.动态扩展类路径 这使用已知的技巧在系统类加载器上使用反射来避免封装,从而添加类路径。 plugins /目录已按预期添加(