首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态加载Jar并实例化已加载类的对象

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

Stack Overflow用户
提问于 2013-04-19 20:28:07
回答 1查看 6.8K关注 0票数 2

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

下面是类加载器的代码:

代码语言:javascript
复制
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中的类:

代码语言:javascript
复制
package com.jarred.exp;

public class Jarred {

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

}

它给了我:

代码语言:javascript
复制
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)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-22 04:46:43

您的文件URL似乎无效。

"File URIs in Windows"

本地Windows文件路径的

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

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

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

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

代码语言:javascript
复制
String filePath = new String("C:/Users/Mehdi/Desktop/JavaClassLoader/jarred.jar");

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

file:后面只有两个斜杠。也许吧

代码语言:javascript
复制
    myJarFile = new URL("file://"+filePath);

应该是

代码语言:javascript
复制
    myJarFile = new URL("file:///"+filePath);

或者,您可以使用java.io.File.toURI,如下所示

代码语言:javascript
复制
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();

具有适当的异常处理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16104605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档