`
C_J
  • 浏览: 124704 次
  • 性别: 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?

相关推荐

    ClassLoader运行机制 自己写的

    ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的

    ClassLoader

    Java 虚拟机中ClassLoader 相关简介 双亲委托机制 Android 中ClassLoader 简介

    自定义classloader的使用

    自定义classloader的使用

    ClassLoader原理

    ClassLoader原理,ClassLoader原理 ClassLoader原理

    Java ClassLoader定制实例

    Java ClassLoader定制实例

    Classloader

    Classloader

    java classloader classpath 张孝祥

    java classloader classpath 张孝祥

    理解Java ClassLoader机制

    理解Java ClassLoader机制

    Android Classloader测试demo

    用于验证理解Android中Classloader加载类机制的程序demo,从中可以对比DexClassLoader和PathClassLoader的区别联系。

    classloader源码

    classloader 源码,自定义classloader

    ClassLoader 案例

    自定义ClassLoader,控制台输入调试。 运行期间 重新载入指定目录的class文件。可实现对于类的功能函数更新。 用到java 反射,@interface 等技术

    classloader

    classloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloader

    ClassLoader类加载机制和原理详解

    ClassLoader类加载机制和原理详解

    深入理解ClassLoader工作机制.docx

    JVM内存模型,类加载模式工作机制详细,内存屏障,类从被加载到虚拟机内存中开始,直到卸载出内存为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三...

    java ClassLoader机制及其在OSGi中的应用

    内容简介: ClassLoader体系结构 类装载器在JVM中并不是唯一的,JVM自带了三个装载器,用户也可以根据自己的需求自定义新的装载器,这些装载器的体系结构可以看作是树状结构,如图1所示:

    JVM ClassLoader简析

    JVM ClassLoader简析.压缩包中文档和示例代码

    ClassLoader 详解.doc

    关于J2EE服务器的ClassLoader的原理,该文档清晰了揭示了jvm装载类的顺序,同时用户可以自定义修改classLoader的配置 通过该文档,可以加深对Java虚拟机的理解

    ClassLoader小例子

    java类加载器的小例子程序,大家可以参看我的博文

Global site tag (gtag.js) - Google Analytics