【发布时间】:2013-04-12 20:18:13
【问题描述】:
我尝试将一个 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 中的类:
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)
您对此有任何想法吗?谢谢。
【问题讨论】:
-
通过接口代理它
-
谢谢。我知道。问题在于识别接口或类或加载的 jar 中的任何内容。
-
不,在您的项目中为 Service 类定义一个接口并使用它。添加加载jar并返回类实例的工厂方法,classname应该是工厂方法的String参数。或者知道类名,直接通过Class.forName(String)方法获取实例
-
你为什么要向系统类加载器添加一个 URL,而不是创建你自己的使用系统类加载器作为父类的 URLClassLoader? Java VM 甚至不需要系统类加载器,因此这是非常脆弱的代码。
-
@Mehdi,您的类加载器创建现在看起来更好了。
标签: java web-services dynamic client classloader