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

相关推荐

    Java ClassLoader学习总结

    知识点总结: * Java 类加载机制是 Java 中一个非常重要的机制,它负责加载 Class 文件到 JVM,以供程序使用。 * ClassLoader 是 Java 中的一个抽象类,它的主要作用是加载 Class 文件到 JVM 中。 * ClassLoader ...

    Java基础知识点 - 内容比较全面

    Java是世界上最流行的编程语言之...这些知识点构成了Java开发者必备的基础,深入理解它们有助于编写出高效、稳定的代码。在实际开发中,还需要结合设计模式、异常处理、网络编程等知识,才能构建出完整的Java技术体系。

    Java基础知识点pdf

    ### Java基础知识点详解 #### 一、Java语言的历史与地位 - **计算机语言的历史:** - **第一代语言(机器语言)**:基于0和1的二进制代码,直接与硬件交互,例如早期的打孔机。 - **第二代语言(汇编语言)**:...

    2020年Java各知识点综合面试题.zip

    这份名为"2020年Java各知识点综合面试题.zip"的压缩包,包含了全面的Java面试题目,旨在帮助求职者在短期内提升对Java知识的理解,提高获取工作的机会。以下是对这些知识点的详细解释: 1. **Java基础** - 类与...

    JVM与性能优化知识点整理.rar

    在面试和技术学习中,JVM及其性能优化是不可或缺的知识点。下面,我们将深入探讨JVM的主要组成部分、工作原理以及性能优化策略。 一、JVM的结构与工作流程 1. 类加载子系统:负责加载类文件,包括类的加载、验证、...

    Java的技术点和知识点归纳.pdf

    Java 技术点和知识点归纳涵盖了从基础到高级的多...掌握这些知识点不仅能帮助开发者编写出高质量的Java代码,也能在面试中展现出扎实的基础和深入的理解。不断学习和实践这些技术点,将有助于提升Java开发的专业水平。

    java编写的坦克大战游戏代码

    8. **并发与多线程**:在坦克大战游戏中,可能需要同时处理多个游戏对象的更新和渲染,这就涉及到并发和多线程的知识。Java的Thread类和ExecutorService可以帮助开发者高效地管理游戏的并发执行。 9. **资源管理**...

    2022年计算机二级考试综合复习知识点.docx

    下面将详细讲解涉及的几个关键知识点: **一、设置表格边框** 1. **选择表格**:首先打开Word文档,找到包含表格的部分,然后选择你想要设置边框的表格或单元格。 2. **设置边框**:右键点击所选表格,从弹出的菜单...

    JVM与性能优化知识点整理.pdf

    ### JVM与性能优化知识点整理 #### 一、JVM内存区域划分 ##### 1. 程序计数器(线程私有) 程序计数器(Program Counter Register),也称为PC寄存器,用于记录当前线程所执行字节码的行号指示器。它是一个较小的...

    corejava基础重要知识点总结

    = 秘书 = 类加载器 = ClassLoader = 保镖 = 字节码校验器 = ByteCode Verifier = 翻译 = 解释执行器 = Interfreter 2:安全 健壮 电力 电信 银行 都会有限考虑使用java实现 3:免费 开源 4:简单 语法简单...

    java面试题题库详解

    **知识点概述:** - **String 类型的基本理解:** 在 Java 中,`String` 是一个不可变的对象,它代表了字符序列。 - **与其他类型的不同:** `String` 是对象而非原始数据类型;`String` 对象一旦创建后,其值不能...

    java基础知识

    以下将详细讲解这些知识点: 1. 类的修饰符: - default(默认修饰符):若无任何修饰,类仅能在同一包内的类中访问。 - public:类可被任何地方的类访问。 - final:用于声明最终类,不能被继承。 - abstract...

    Core Java面试重点知识总结

    在面试中,能够清晰地阐述这些知识点将有助于展示你的专业能力。例如,讨论如何处理内存溢出错误、分析线程安全问题、以及解释Java栈与程序计数器在多线程环境中的作用,都是展示技术深度的有效方式。同时,熟悉JVM...

    面试常见知识点.docx

    2. **代码复用**:泛型允许开发人员编写可以适用于多种类型的通用代码,减少了代码重复。 3. **性能提升**:泛型避免了运行时不必要的装箱和拆箱操作,提升了性能。 ### Java反射中Class.forName与ClassLoader的...

    jvm基础学习,介绍各种jvm里面的知识点,和深入理解java虚拟机很像,易懂

    1. **栈**:每个线程拥有自己的栈空间,用于存储局部变量和方法调用的信息。每当执行一个方法时,就会为该方法分配一个新的栈帧,其中包含局部变量表、操作数栈、动态链接和方法返回地址等。 2. **堆**:是所有...

    Java基础核心知识点总结(79页).pdf

    它是一种多范式的、面向对象的语言,以其“一次编写,到处运行”的特性而闻名。Java的特点包括平台独立性、安全性、高性能、健壮性以及可移植性。它的设计目标是使软件开发过程简化,同时提供丰富的类库支持各种应用...

    java深度历险

    总的来说,这本书将引导读者进行一次深度的Java技术探索之旅,通过对JVM、Classpath、ClassLoader和import等关键知识点的深入学习,提升开发者对Java平台的理解,从而更好地应对复杂软件开发挑战。

    Java基础知识

    本节将深入探讨Java线程间通信、Java类加载器以及JVM内存模型这三个核心知识点。 首先,我们来讨论Java线程间通信。在多线程环境下,线程间通信是确保程序正确执行的关键。Java提供了多种机制来实现这一目标,如...

    java写的java虚拟机

    在深入理解Java虚拟机的过程中,我们需要掌握以下几个关键知识点: 1. **字节码**:Java源代码编译后生成的中间表示,以`.class`文件形式存在,由JVM负责解释执行。 2. **类加载器**:负责加载类到JVM内存中,包括...

    初学java学习步骤

    学习 Java 的步骤是非常重要的,掌握每一步骤的知识点是非常必要的。首先,安装好 JDK,编写第一个 Hello World 程序,了解 JDK 的基本概念和 ClassLoader 是如何加载 Class 的。这一步骤是非常基础的,需要认真学习...

Global site tag (gtag.js) - Google Analytics