java自定义类加载器:我的类加载器没有加载某些类

时间:2011-01-23 20:57:18

标签: java classloader

我正在编写一个自定义类加载器,我已经使用参数

将其设置为默认的类加载器
-Djava.system.class.loader=MyClassLoader

我的类加载器加载了大多数类,但有些类不是,为什么? 这些类是外部jar文件。

更新 这是一个例子

public class Main{
    public static void main(String[] args) {
        try{
            // A simple class loader, ovveride loadClass
            // method and print in stdout the name of the class loaded.
            MyClassLoader classLoader=new MyClassLoader(MyClassLoader.class.getClassLoader());
            Class init=classLoader.loadClass("Initializer");
            Object instance=init.newInstance();
            init.getMethod("init").invoke(instance);
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
    }
}

public class A{

    public A() {
        System.out.println("Im A");
    }
}

public class Initializer {

     public void init() {
        A a=new A();
    }
}

问题是:我希望我的类加载器加载了A类,但这不会发生,为什么?

更新

无论如何,我想用我的类加载器加载我的所有类,因为我想加密类代码并在运行时解密它。 那么,我如何使用我的类加载器作为所有类的默认类加载器?

感谢。

1 个答案:

答案 0 :(得分:1)

引导程序类加载器将始终加载java.lang下的任何内容。

来自http://en.wikipedia.org/wiki/Java_Classloader

  

当JVM启动时,三个类   使用装载机[3] [4]:

     
      
  1. Bootstrap类装入器
  2.   
  3. 扩展类加载器
  4.   
  5. 系统类加载器
  6.         

    bootstrap类加载器加载   核心Java库[5]   (/ lib目录)。这个   类加载器,它是的一部分   核心JVM,用本机代码编写。

         

    扩展类加载器加载   扩展目录中的代码   (/ lib / ext或任何其他   由...指定的目录   java.ext.dirs系统属性)。它是   由...实施   sun.misc.Launcher $的ExtClassLoader   类。