有一个主类A,在类A中调用类B,而类B中要调用一个类C,但类C放在外部jar包中,现在想要动态将C加载到程序中,如何用ClassLoader将C动态加载到虚拟机中,并使用它呢,请高手赐教!class A {
public static void main(String[] args) {
classloader.loadClass("C");//想在此加载类C,然后在类B中可以直接使用类C,不知道此处如何写才能实现
//在类B中直接使用C
new B();
}
}class B {
public void print() {
new C();//在此直接使用C
System.out.println("c load sucess");
}
}
public static void main(String[] args) {
classloader.loadClass("C");//想在此加载类C,然后在类B中可以直接使用类C,不知道此处如何写才能实现
//在类B中直接使用C
new B();
}
}class B {
public void print() {
new C();//在此直接使用C
System.out.println("c load sucess");
}
}
系统类加载器会去加载C类,如果加载不到,会调用系统类加载器的父类加载器 --扩展类加载器加载 ,如果扩展类加载器也加载不到,将继续由扩展类加载器的父类加载器 --根类加载器加载 ,如果根类加载器也加载不到 ,则会抛出类找不到异常ClassNotFoundException ;你可以把C类的jar包全路径放到classpath中 ,或者放到 jdk\jre\lib\ext找
jar包不能加到classpath里,我需要动态加载jar包
jar包不能加到classpath里,也不能放到 jdk\jre\lib\ext里,我需要动态加载jar包
生成Class后呢?可以直接使用自定义classloader加载的类吗?
* @param args
*/
public static void main(String[] args) {
try {
File classDir = new File("C:\\t2.jar");
ClassLoader parentLoader = Test.class.getClassLoader();
URLClassLoader loader1 = new URLClassLoader(new URL[] { classDir.toURL()}, parentLoader);
Class cs1 = loader1.loadClass("Services");
B b = new B(cs1);
b.print();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
System.out.println("helloWrold");
}
}public class B {
Class cs;
public B(Class cs) {
this.cs = cs;
}
public void print() {
Services s = null;
try {
s = (Services)cs.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
s.print();
}
}Services 放在t1.jar包中
public class Services {
public void print() {
System.out.println("services");
}
}我试过了,这种情况下不能直接使用