就是在new 对象的时候 不是调用系统的ClassLoader
而是调用我自己定义的
系统默认的ClassLoader是哪个类的实力?
打算拦截一下 然后记录下 加载了哪些类 哪些包
因为加载的包太多了 搞不清楚 哪些用过 哪些没用过
而是调用我自己定义的
系统默认的ClassLoader是哪个类的实力?
打算拦截一下 然后记录下 加载了哪些类 哪些包
因为加载的包太多了 搞不清楚 哪些用过 哪些没用过
JDK的类都是用启动类装载器装载,系统系统默认的ClassLoader的父ClassLoader就是启动类装载器,那个是用C或其他的什么语言写的.......System.class.getClassLoader();//系统的Thread.currentThread().getClass().getClassLoader();//当前线程的.
这个类用类名作参数就能记录了,希望有帮助。
public class VerboseLoader extends URLClassLoader
{
protected VerboseLoader(URL[] urls, ClassLoader parent) {
super(urls, parent);
}
public Class loadClass(String name)
throws ClassNotFoundException {
System.out.println("loadClass: " + name);
return super.loadClass(name);
} protected Class findClass(String name)
throws ClassNotFoundException {
Class clas = super.findClass(name);
System.out.println("findclass: loaded " + name +
" from this loader");
return clas;
} public static void main(String[] args) {
if (args.length >= 1) {
try {
// get paths to be used for loading
ClassLoader base =
ClassLoader.getSystemClassLoader();
URL[] urls;
if (base instanceof URLClassLoader) {
urls = ((URLClassLoader)base).getURLs();
} else {
urls = new URL[]
{ new File(".").toURI().toURL() };
}
// list the paths actually being used
System.out.println("Loading from paths:");
for (int i = 0; i < urls.length; i++) {
System.out.println(" " + urls[i]);
}
// load target class using custom class loader
VerboseLoader loader =
new VerboseLoader(urls, base.getParent());
Class clas = loader.loadClass(args[0]);
//after class loaded, the main() can be invoked
/*Class[] ptypes =
new Class[] { args.getClass() };
Method main =
clas.getDeclaredMethod("main", ptypes);
String[] pargs = new String[args.length-1];
System.arraycopy(args, 1, pargs, 0, pargs.length);
Thread.currentThread().
setContextClassLoader(loader);
main.invoke(null, new Object[] { pargs });*/
} catch(Exception e){
e.printStackTrace();
}
} else {
System.out.println
("Usage: VerboseLoader main-class args...");
}
}
}
这样不行啊
原有代码中 对象都是new出来的
这样要改好多地方~~~~~~~~~~~~~~~~~~~~
设一下
-Xbootclasspath:<路径> 覆盖引导类文件的位置就行了,你再牛一点的话,重写个JDK玩玩也不错啊。