`
nanapoleon
  • 浏览: 48031 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

ClassLoader学习记录2

阅读更多
    写程序的时候,时常会思考,我们的类是哪来的?为何我们想用sdk中的类,就有这个类呢?答案肯定是classloader读进虚拟机来的。那他究竟是怎么被加载到虚拟机中的呢?看看如何定制classloader的代码,就相当一目了然了。
main() {
    runClass(name, key);
}

public void runClass(String name, int key){
    ClassLoader classLoader = new CryptoClassLoader(key);
    Class<?> c = classLoader.loadClass();
    Method m = c.getMethod("main", String[].class);
    m.invoke(null, (Object)new String[]{});
}

class CryptoClassLoader extends ClassLoader{
    int key;

    CryptoClassLoader(int key){
        this.key = key
    }

    protected Class<?> findClass(String name) throws ClassNotFoundException{
        byte[] classBytes = null;
        try{
            classBytes = loadClassBytes(name);
        } catch(IOException e) {
            throw new ClassNotFoundException();
        }
        
        Class<?> cl = defineClass(name, classBytes, 0, classBytes.length);
        if (cl == null) throw new ClassNotFoundException(name);
        return cl;
    }

    private byte[] loadClassBytes(String name) throws IOException{
        String cname = name.replace(".","/") + ".caesar"; //(我怎么觉得应该是.class? 不太懂这里...不会印刷错误吧?)
        FileInputStream in = null;
        in = new FileInputStream(cname);
        try{
            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
            int ch;
            while((ch = in.read()) != -1){
                byte b = (byte)(ch - key);
                buffer.write(b);
            }    
            return b.toByteArray();
        } finally {
            in.close(); 
        }    
    }
}

    此段代码看完发现(defineClass方法),虚拟机加载新类的方式就是:使用父类的defineClass方法将某Class类的字节码传递给虚拟机,(其实就是以字节形式把字节码传递给虚拟机),并且创建相应的类。
    下来解释一下上面的程序:key这个int。这个例子使用了一个小的加密方法,就是类文件中所有的字节都向后移动了key个位置,比如3,那么,在加载此类时,就应该向前移动3,来保证文件被解密。这里我们就引申出了自定义classloader的用法之一,即加密。你想使用这个类?请知道密钥先!就好像游戏的注册码一样,没有key和我们的classloader,你拿到类文件也是没有任何意义的。(好吧我承认程序里的加密方法不怎么先进)
    怎么样,很棒吧。其实一直以来,还有个疑问,如果包名和类名一样的情况,classloader应该如何处理?首先,像上面的情况,一个路径下是不能放相同名字的类文件的,先排除此情况。那如果在多jar包的环境下,真的有两个一样的类名呢?我想、估计是直接使用第一个被load进的类吧,因为classloader会判断此类已经被加载进来了,毕竟classloader也不会读心数,知道你想使用哪个jar包的类。
    其实,如果类名和包名都重复,我们可以看见,如果classloader不一样,你那么也不会有任何问题,它们之间是不会相互干扰的,比如Web中的每个applet,就是由不同的classloader加载的,所以,命名冲突在applet之间是允许的。就好像不同的命名空间
    还有个比喻,我想到的,可能会比较烂。比如,android上的两个不同的apk,如果两个程序中,使用相同的包名和类名的话,应该也不会相互干扰,因为不同的classloader导致。(因为每个进程都有自己的虚拟机,那么classloader也理应不同,恩,应该是这样,本身classloader就是给虚拟机服务的嘛。)
   
   
分享到:
评论

相关推荐

    web_classloader_test.zip_web classloader

    在Java Web应用中,类加载...通过分析`web_classloader_test`,我们可以学习到如何理解和调试Web应用的类加载问题,以及如何利用类加载器的特性来实现特定的功能。这个示例对于理解Java Web应用的运行机制非常有价值。

    记录一些自己学习MySQL,JUC,JVM的学习笔记.zip

    3. 类加载器:学习不同的类加载器,如Bootstrap ClassLoader,Extension ClassLoader和App ClassLoader。 4. 垃圾回收:深入理解垃圾回收机制,如分代收集,可达性分析,以及不同GC算法,如Serial、Parallel、CMS和...

    java之jvm学习笔记五(实践写自己的类装载器)

    这个“java之jvm学习笔记五(实践写自己的类装载器)”很可能是对这一主题的详细探讨。 类装载器在Java中的主要职责是动态加载类到JVM中。Java的类装载器分为三个基本层次:启动类装载器(Bootstrap ClassLoader)、...

    java学习笔记整理

    【Java学习笔记整理】 Java是一种广泛使用的编程语言,它不仅是一种语言,还是一个软件开发平台和运行环境。Java分为三个主要版本:Java标准版(JSE)、Java缩微版(JME)和Java企业版(JEE)。JSE主要用于桌面应用...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    丛书名: 学习笔记 出版社:清华大学出版社 ISBN:9787302282082 上架时间:2012-5-9 出版日期:2012 年5月 开本:16开 页码:564 版次:1-1 所属分类:计算机 &gt; 软件与程序设计 &gt; JAVA(J#) &gt; Java 编辑推荐   ...

    阿里P8 架构师整理Java学习笔记.pdf

    ### Java学习笔记知识点总结 #### 一、JVM与内存管理 **1.1 JVM基本概念** - **JVM(Java Virtual Machine)**: Java虚拟机是执行Java字节码的虚拟机,它提供了运行Java程序所需的环境。 **1.2 线程** - **线程...

    Java Classloading Mechanism : ClassLoader & ASM & 动态字节码增强

    它可以在不修改原有代码的情况下,为类添加额外的功能,如日志记录、事务管理、性能监控等。这种技术在插件框架、代理服务和调试工具中广泛应用。 总结起来,Java的类加载机制保证了程序的稳定运行,而ASM库则提供...

    深入Java虚拟机JVM类加载学习笔记

    ### 深入Java虚拟机JVM类加载学习笔记 #### 一、Classloader机制解析 在Java虚拟机(JVM)中,类加载器(ClassLoader)是负责将类的`.class`文件加载到内存中的重要组件。理解类加载器的工作原理对于深入掌握JVM以及...

    java 学习笔记(经典)

    根据提供的文件信息,这里将对Java学习笔记中的关键知识点进行详细阐述,主要涉及Java语言的基础概念、面向对象编程思想的应用以及Java类加载器的工作原理等内容。 ### Java学习基础 Java是一种广泛使用的高级编程...

    jVM学习笔记.ppt

    这一过程涉及到类加载机制,包括Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader和Custom ClassLoader,它们按照特定的层次关系和加载顺序加载类,确保类的唯一性。 类执行机制中,JVM基于栈的架构...

    J2EE-JDBC学习笔记

    ### J2EE-JDBC学习笔记知识点详述 #### JDBC驱动注册的三种方式 在Java开发中,使用JDBC(Java Database Connectivity)与数据库进行交互前,必须先注册对应的数据库驱动。J2EE环境下,通常有以下三种注册方式: ...

    安卓逆向学习笔记之ART定制方案比较和流程.docx

    ### 安卓逆向学习笔记之ART定制方案比较和流程 #### 一、概述 本文档旨在探讨Android Runtime (ART)环境下,针对不同ART定制方案的对比分析,并介绍实现逆向工程过程中的具体步骤与技巧。逆向工程是研究软件内部...

    springBoot学习笔记整理

    ### Spring Boot 学习笔记之热部署与代码变更检测 #### 概述 Spring Boot 是一个基于 Spring 的框架,旨在简化新 Spring 应用程序的初始设置和开发过程。Spring Boot 的目标是允许开发者“只是运行”,即尽可能...

    安卓逆向学习笔记之FART主动调用组件设计和源码分析.docx

    ### 安卓逆向学习笔记之FART主动调用组件设计和源码分析 #### 一、概述 本文档旨在探讨安卓逆向工程中的一个重要工具——FART(Find And Replace Tool),并着重介绍如何利用该工具进行主动调用组件的设计与源码...

    安卓逆向学习笔记之使用frida改进FART.docx

    ### 安卓逆向学习笔记之使用frida改进FART #### 一、FART工具原理及工作流程 FART(Find And Replace Tool)是一种针对Android应用进行逆向工程的工具,主要用于查找并替换Android应用中的指定代码或数据。本文档...

    JVM性能学习笔记思维导图

    本文将根据"JVM性能学习笔记思维导图"的主题,详细阐述JVM的主要组成部分,性能调优的关键点以及相关的工具与实践策略。** 1. **JVM结构与内存模型** - **类装载器(ClassLoader)**:负责加载类文件,确保类在运行...

    java学习笔记JDK6课件之十六

    Java学习笔记JDK6课件第16章深入讲解了反射机制,这是Java语言中一个强大的特性,允许我们在运行时动态地获取类的信息并进行操作。反射的核心是`java.lang.Class`类,它代表了Java应用程序运行时加载的类或接口实例...

    Java学习笔记_内存管理.rar

    这份"Java学习笔记_内存管理.pdf"很可能是详细解析了Java如何进行内存分配、垃圾回收以及内存泄漏等相关概念。下面,我们将深入探讨Java内存管理的一些核心知识点。 1. **Java内存模型**: - **堆内存(Heap)**:...

    java序列回显学习.doc

    2. **ClassLoader基础知识** - 类加载器(ClassLoader)是Java虚拟机的一部分,负责加载类到JVM中。 - 加载过程包括加载、连接(验证、准备、解析)、初始化三个阶段。 - **双亲委托机制**:ClassLoader在加载类...

    Thinkinjava学习笔记.pdf

    - JVM类加载器包括Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader,分别负责加载Java核心库、扩展库和应用程序类库。 8. Java中的异常处理 - Java使用try、catch、finally关键字来处理...

Global site tag (gtag.js) - Google Analytics