现在有两个类:
class A{
  public void method(...) {
    //这里会调用一些动态加载的包
  }
}class B{
 public void callA() {
   A a = ...;//我想指定一个ClassLoader,这个ClassLoader里面有动态加载的包
   a.method(...);
 }
}哪位大虾指点,分不够再加。

解决方案 »

  1.   

    不太明白你的问题,A.class.getClassLoader(),拿到ClassLoader还有什么做不了的事吗
      

  2.   

    public static ClassLoader getClassLoader(java.lang.Class defineClass) {
    return defineClass.getClassLoader();
    }
    public static Class getClass(String className) throws ClassNotFoundException {
    return (getClassLoader().loadClass(className));
    }
    呵呵,你可以任意自定义ClassLoader load任意class,如果编译器允许的话.
      

  3.   

    不明白,我现在的做法是在实例化A前用Thread().currentThread().setContextCloassLoader().
    这样也可以实现,但是我不想影响B的context loader,我也不想A运行在另外一个线程里面。
      

  4.   

    你能用setContextCloassLoader(ClassLoader cl)那你就知道了ClassLoader了.
    那你直接cl.loadClass("A");不可以么
      

  5.   

    cl.loadClass("A");是可以的,但是Class A里面使用了动态加载的东西找不到,我在A里面打印this.class.getClassLoader()并不是我的ClassLoader.
      

  6.   

    我知道ClassLoader,因为是我自己定制的,我希望指定A的ClassLoader,但是不希望影响B的ClassLoader,不知道有没有办法?
      

  7.   

    你定制的ClassLoader假设为cl,
    每次实例化A的时候,都使用cl.loadClass("A").newInstance().
    这一点都不影响B啊.
    setContextCloassLoader是指定整个线程context的ClassLoader,当然影响B了.A里面使用了什么动态加载的东西?反射?
      

  8.   

    比如说cl = new URLClassLoader(new URL[]{"file://ddd.jar"}, Thread.currentThread().getCurrentThread())
    Class C 在ddd.jar里面.
    我试了
    cl.loadClass("A").newInstance().这样的方法。A可以从cl里面得到没问题,cl.loadClass("C")也可以,但是在A里面System.out.println(this.getClass().getClassLoader().getClass().getName());并不是URLClassLoader,是com.sun.的什么appclassloader。直接调用C则会抛异常ClassNotFound.还有我的Class c可能是静态方法,如何调用呢?
      

  9.   

    Class C 调用一个静态方法,方法传入一个java类的目录,目录下的包并没有在原来的ClassLoader里面,这个静态方法会调用这个目录下的类,用原来的ClassLoader不行,setContextClassLoader可以,但是会影响B,现在寻求一个不会影响B,不新建Thread的方法。