在 Java 运行时尝试从 jar 文件加载 class 时出现 ClassNotFoundException

ClassNotFoundException when trying to load a class from a jar file at runtime in Java

我正在尝试从 jar 文件中的 class 动态执行函数。我有 jar 文件的位置,class 的名称和其中的函数作为字符串。

我查看了这些问题,但 none 的答案对我有用:

How should I load Jars dynamically at runtime?

How to load a jar file at runtime

Dynamically load a jar

Load jar dynamically at runtime?

这是我目前得到的: 在主程序中:

    public class Main
    {

        public static void main(String[] args)
        {
            File file = new File("E:\DeSKtop\hw.jar");   
            String lcStr = "Main1";   
            URL jarfile;
            try {
                jarfile = new URL("jar", "","file:" + file.getAbsolutePath()+"!/");
                URLClassLoader cl = URLClassLoader.newInstance(new URL[] {jarfile });   
                Class loadedClass = cl.loadClass(lcStr);
                Method method = loadedClass.getDeclaredMethod("returnHW");
                Object instance = loadedClass.newInstance();
                Object result = method.invoke(instance);
                //System.out.println(method.invoke());
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }    
            //System.out.println(loadLibrary(myJar));
            catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InstantiationException 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();
            }

        }

在我尝试加载的 jar 文件中:

public class Main1 {
    public static void main(String[] args)
    {

    }
    public static String returnHW()
    {
        System.out.println("HlloWOrld");;
        return "Hello Wrld!";
    }

}

当我尝试 运行 主程序时,我得到了这个:

java.lang.ClassNotFoundException: Main1
    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 Main.main(Main.java:22)

你能告诉我我做错了什么吗?提前谢谢你。

解决办法是你也必须说明包裹。

如果您更新存储类名的变量 lcStr 以包含包,它将起作用。

示例:

        String lcStr = "com.company.Main1";