`
C_J
  • 浏览: 124933 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

编写自己的ClassLoader知识点

阅读更多

题记:
    看到InfoQ关于ClassLoader的文章,挺给力。自己对ClassLoader有更全面的认知。

    Java编译成class给JVM运行,JVM通过ClassLoader去load这个class并为每个class有且只生成一个Class类,以后这个Class就可以生成instance实例了。为了保护某个类不重复加载,JVM就需要在加载class的时候去查询,这个工作由ClassLoader的findLoadedClass和findBootstrapClass0来做。      ClassLoader也搞了个继承,处于最顶层是BootstrapClass,然后ExtClassLoader,然后AppClassLoader。那到底先从哪个ClassLoader开始呢?
    先从当前ClassLoader开始,ClassLoader代码如下:
    除开其他关于loadResource的方法,只有一个loadClass的public方法,如下:

public Class<?> loadClass(String name) throws ClassNotFoundException {
    return loadClass(name, false);
    }
 protected synchronized Class<?> loadClass(String name, boolean resolve)
    throws ClassNotFoundException
    {
    // 首先,查询名为name的class有没有加载过
    Class c = findLoadedClass(name); // 查询当前ClassLoader有没有加载过
    if (c == null) { // 如果没有
        try {
        if (parent != null) {
            c = parent.loadClass(name, false); // 查询上层LoadClass有没有加载过
        } else {
            c = findBootstrapClass0(name); // 一直遍历到了BootstrapClassLoader,native方法        }
        } catch (ClassNotFoundException e) {
            // If still not found, then invoke findClass in order
            // to find the class.
            c = findClass(name); // 可扩展点
        }
    }
    if (resolve) {
        resolveClass(c);
    }
    return c;
    }
 

  
    所以写自己的ClassLoader可以override findClass方法,然后调用protected final Class<?> defineClass(String name, byte[] b, int off, int len)来加载class了。
    当然你也可以只override loadClass方法,但什么都不做。然后调用defineClass来尝试加载同一个class,我不知道会怎样,还没有尝试过,有人尝试记得告诉我一声。

    所以写自己的ClassLoader,就可以这样:

    class MyCL extends ClassLoader{
       protected Class<?> findClass(String name) throws ClassNotFoundException {
    throw new ClassNotFoundException(name);
    ...
        }
    }
 


分享到:
评论
9 楼 C_J 2011-05-01  
有必要这么鸡冻咩?
8 楼 jason61719 2011-05-01  
你这不是说了等于没说吗……就解析个loadClass(),谁不懂啊…
7 楼 freish 2011-01-15  
C_J 写道
onlylau 写道
不知道是什么样的需求,让LZ要自己写ClassLoader。。。

class加解密,OSGi,动态加载class...



另外,楼主所说的动态加载class是何意?是自己搞一段byte[]表示classFile?这个任何classloader都有实现。没明白楼主所指。

OSGi没接触过,不多做评论
6 楼 freish 2011-01-15  
C_J 写道
onlylau 写道
不知道是什么样的需求,让LZ要自己写ClassLoader。。。

class加解密,OSGi,动态加载class...



class加密就算了把,终究要在classloader里解密,本来混淆了之后人家要研究整个jar包,现在只要反编译研究你的classloader就over了

之前有人说过用N(可能上千)个classloader,这,太不切实际了


所以这种方式听着似乎高深,其实是最蠢的加密方式

个人愚见
5 楼 C_J 2011-01-15  
onlylau 写道
不知道是什么样的需求,让LZ要自己写ClassLoader。。。

class加解密,OSGi,动态加载class...
4 楼 onlylau 2011-01-15  
不知道是什么样的需求,让LZ要自己写ClassLoader。。。
3 楼 onlylau 2011-01-15  
ronry 写道
just so so?


just so so ==>  not too bad and not too good
2 楼 C_J 2011-01-14  
what's you mean?
1 楼 ronry 2011-01-14  
just so so?

相关推荐

Global site tag (gtag.js) - Google Analytics