就是在new 对象的时候 不是调用系统的ClassLoader 
而是调用我自己定义的 
系统默认的ClassLoader是哪个类的实力? 
打算拦截一下 然后记录下 加载了哪些类 哪些包 
因为加载的包太多了 搞不清楚 哪些用过 哪些没用过

解决方案 »

  1.   

    实例:sun.misc.Launcher$AppClassLoader@327b8c9f
    JDK的类都是用启动类装载器装载,系统系统默认的ClassLoader的父ClassLoader就是启动类装载器,那个是用C或其他的什么语言写的.......System.class.getClassLoader();//系统的Thread.currentThread().getClass().getClassLoader();//当前线程的.
      

  2.   

    只要是classpath中的类最终都会委派给启动类装载器来装载.
      

  3.   

    记录加载了哪些类,哪些包,还是比较简单的.但是要在new的时候记录就不知道了。
    这个类用类名作参数就能记录了,希望有帮助。
    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...");
            }
        }
    }
      

  4.   

    .............
    这样不行啊 
    原有代码中  对象都是new出来的
    这样要改好多地方~~~~~~~~~~~~~~~~~~~~
      

  5.   

    随随便便被你拦截了,Java还有什么安全可言?
      

  6.   

    JVMTI 使用C语言编写,可以获得JRE都加载了哪些class,而且不需要更改任何代码.
      

  7.   

    很简单啊
    设一下
    -Xbootclasspath:<路径>       覆盖引导类文件的位置就行了,你再牛一点的话,重写个JDK玩玩也不错啊。