有一个主类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");
    }
}

解决方案 »

  1.   

    运行后需不需要改变class C,如果不需要,直接在运行时把jar包添加到classpath就可以了
      

  2.   

    你运行A类就可以了 因为A类为启动类 ,是类的主动使用 ,所以 ClassLoader会加载A类,只要你new C();
    系统类加载器会去加载C类,如果加载不到,会调用系统类加载器的父类加载器 --扩展类加载器加载 ,如果扩展类加载器也加载不到,将继续由扩展类加载器的父类加载器 --根类加载器加载 ,如果根类加载器也加载不到 ,则会抛出类找不到异常ClassNotFoundException ;你可以把C类的jar包全路径放到classpath中 ,或者放到 jdk\jre\lib\ext找
      

  3.   


    jar包不能加到classpath里,我需要动态加载jar包
      

  4.   


    jar包不能加到classpath里,也不能放到 jdk\jre\lib\ext里,我需要动态加载jar包
      

  5.   

    可以自定义一个ClassLoader类继承自java.lang.ClassLoader,将jar解包,读取class文件到字节数组里,用ClassLoader的defineClass生成Class
      

  6.   


    生成Class后呢?可以直接使用自定义classloader加载的类吗?
      

  7.   

    可以直接用,用Class类的newInstance()方法就可以获得实例了
      

  8.   

    public class Test {    /**
         * @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");
        }
    }我试过了,这种情况下不能直接使用
      

  9.   

    自定义一个URLClassLoader,读取jar文件要用java.util.jar.JarFile