我正在编写一个自定义类加载器,我已经使用参数
将其设置为默认的类加载器-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类,但这不会发生,为什么?
更新
无论如何,我想用我的类加载器加载我的所有类,因为我想加密类代码并在运行时解密它。 那么,我如何使用我的类加载器作为所有类的默认类加载器?
感谢。
答案 0 :(得分:1)
引导程序类加载器将始终加载java.lang
下的任何内容。
来自http://en.wikipedia.org/wiki/Java_Classloader:
当JVM启动时,三个类 使用装载机[3] [4]:
- Bootstrap类装入器
- 扩展类加载器
- 系统类加载器
醇>bootstrap类加载器加载 核心Java库[5] (/ lib目录)。这个 类加载器,它是的一部分 核心JVM,用本机代码编写。
扩展类加载器加载 扩展目录中的代码 (/ lib / ext或任何其他 由...指定的目录 java.ext.dirs系统属性)。它是 由...实施 sun.misc.Launcher $的ExtClassLoader 类。