论坛首页 Java企业应用论坛

编写自己的ClassLoader知识点

浏览 7463 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-01-13  
OO

题记:
    看到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);
    ...
        }
    }
 


   发表时间:2011-01-14  
just so so?
0 请登录后投票
   发表时间:2011-01-14  
what's you mean?
0 请登录后投票
   发表时间:2011-01-15  
ronry 写道
just so so?


just so so ==>  not too bad and not too good
0 请登录后投票
   发表时间:2011-01-15  
不知道是什么样的需求,让LZ要自己写ClassLoader。。。
0 请登录后投票
   发表时间:2011-01-15  
onlylau 写道
不知道是什么样的需求,让LZ要自己写ClassLoader。。。

class加解密,OSGi,动态加载class...
0 请登录后投票
   发表时间:2011-01-15  
C_J 写道
onlylau 写道
不知道是什么样的需求,让LZ要自己写ClassLoader。。。

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



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

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


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

个人愚见
0 请登录后投票
   发表时间:2011-01-15  
C_J 写道
onlylau 写道
不知道是什么样的需求,让LZ要自己写ClassLoader。。。

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



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

OSGi没接触过,不多做评论
0 请登录后投票
   发表时间:2011-05-01  
你这不是说了等于没说吗……就解析个loadClass(),谁不懂啊…
0 请登录后投票
   发表时间:2011-05-01  
有必要这么鸡冻咩?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics