在 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";
我正在尝试从 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";