类加载器的深入讲解与应用

第8单元:类加载器的深入讲解与应用

第8单元:类加载器的深入讲解与应用

第8单元:类加载器的深入讲解与应用

44.类加载器及其委托机制的深入分析

package java_5;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class MyClassLoader extends ClassLoader {
    static String srcPath;
    static String destPath;

    public static void main(String[] args) throws Exception {
          srcPath = args[0];
          destPath = args[1];
         InputStream in = new FileInputStream(srcPath );
          srcPath = srcPath .substring(0, srcPath.lastIndexOf('\\' ) - 6);
         OutputStream out = new FileOutputStream(srcPath + "\\" + destPath
                 + ".class");
         ClassLoader cl = MyClassLoader.class .getClassLoader().getParent();
        System. out.println(cl.getClass().getName());
          addSecrity(out, in);
    }

    public static void addSecrity(OutputStream dest, InputStream src)
              throws IOException {
          int b = 0;
          while ((b = src.read()) != -1) {
             b = b ^ 0xff;
             dest.write(b);
         }

    }

    @Override
    protected java.lang.Class<?> findClass(String name)
              throws ClassNotFoundException {
         String srcPath = "G:\\workplace\\javase\\lib\\" ;
         InputStream in = null;
          try {
             in = new FileInputStream(srcPath+name+".class" );
         } catch (FileNotFoundException e) {
             e.printStackTrace();
         }
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
          try {
              addSecrity(baos,in);
         } catch (IOException e) {
             e.printStackTrace();
         }
          byte[] bytes = baos.toByteArray();
          Class clazz = defineClass (bytes, 0, bytes.length );
          return clazz;
    };

    private String name;

    public MyClassLoader() {
    }

    public MyClassLoader(String name) {
          this.name = name;
    }

}

有包名的类不能调用无包名的类

时间: 2024-10-28 22:02:45

类加载器的深入讲解与应用的相关文章

【Android高级】Dalvik虚拟机及其类加载器讲解

插件开发的过程中DexClassLoader和PathClassLoader这两个类加载器了是很重要的,但是他们也是有区别的,而且我们也知道PathClassLoader是Android应用中的默认加载器.他们的区别是: DexClassLoader可以加载任何路径的apk/dex/jar PathClassLoader只能加载/data/app中的apk,也就是已经安装到手机中的apk.这个也是PathClassLoader作为默认的类加载器的原因,因为一般程序都是安装了,在打开,这时候Pat

自定义一个类加载器

http://www.cnblogs.com/xrq730/p/4847337.html 为什么要自定义类加载器 类加载机制:http://www.cnblogs.com/xrq730/p/4844915.html 类加载器:http://www.cnblogs.com/xrq730/p/4845144.html 这两篇文章已经详细讲解了类加载机制和类加载器,还剩最后一个问题没有讲解,就是 自定义类加载器.为什么我们要自定义类加载器?因为虽然Java中给用户提供了很多类加载器,但是和实际使用比起

Java基础知识之类加载器

1.类加载器定义 1.1类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制.JVM中用来完成上述功能的具体实现就是类加载器.类加载器读取.class字节码文件将其转换成java.lang.Class类的一个实例.每个实例用来表示一个java类.通过该实例的newInstance()方法可以创建出一个该类的对象. 1.2类的生命周期: 类从加载到虚拟

45_自定义类加载器的编写原理分析

知识讲解 自定义的类加载器必须继承ClassLoader loadClass方法与findClass方法 defineClass方法 编程步骤 编写一个对文件内容进行简单加密的程序. 编写一个自己的类加载器,可实现对加密过得类进行加载和解密. 编写一个程序调用类加载器加载类,在源程序中不能用该类名定义引用变量,因为编译器无法识别这个类.程序中可以除了使用ClassLoader.load方法之外,还可以使用设置线程的上下文类加载器或者系统类加载器,然后再使用Class.forName. 实验步骤:

JAVA 类加载器 第14节

JAVA 类加载器 第14节 今天我们将类加载机制5个阶段中的第一个阶段,加载,又叫做装载.为了阅读好区分,以下都叫做装载. 装载的第一步就是要获得二进制的字节流,它可以从读.class文件获得,也可以从网络中接收别人发送的字节流.反正只要符合虚拟机规定的字节流格式都可以进入这个阶段. 有了字节流了之后,要进行装载还需要一个工具,那就是加载器了.加载器既可以使用系统提供的引导类加载器,也可以用户自己定义加载器,只需要继承ClassLoader,再重写loadClass()方法就可以实现一个自己的

Java类加载器ClassLoader的说明

(1)API文档内容如下: 类加载器是负责加载类的对象.ClassLoader 类是一个抽象类.如果给定类的二进制名称,那么类加载器会试图查找或生成构成类定义的数据.一般策略是将名称转换为某个文件名,然后从文件系统读取该名称的"类文件". 每个 Class 对象都包含一个对定义它的 ClassLoader 的引用. 数组类的 Class 对象不是由类加载器创建的,而是由 Java 运行时根据需要自动创建.数组类的类加载器由 Class.getClassLoader() 返回,该加载器与

虚拟机类加载机制(2)——类加载器

<深入理解Java虚拟机>一书中将类的加载过程放到了类加载器前面一节,但在这里我想先讲“类加载器”.在上一篇类加载时机中我们用大量篇幅来讲解了类加载过程中的5个步骤的最后一步——初始化.在这一节中,我们实际是在讲解类加载过程5个步骤的第一步——加载. 我们再次回顾类加载过程的5个步骤: 类加载过程的“加载”步骤是通过类加载器(ClassLoader)来实现的.那么加载阶段做什么工作呢?“通过一个类的全限定名来获取描述此类的二进制字节流.”首先我们需要了解来自同一个Class文件的两个类是否一定

[Java类加载器]Java中classLoader浅析.

本文为在公司内部TD上写的一篇小文, 主要讲解java中classLoader基础知识, 现在拿来这里分享一下. 一.问题 请在Eclipse中新建如下类,并运行它: 1 package java.lang; 2 3 public class Long { 4 public static void main(String[] args) { 5 System.out.println("Hi, i am here"); 6 } 7 } 你能猜到它的运行如果吗? 不错,就是如下这个样子!

tomcat 7 中的类加载器学习

tomcat 7自带很多junit测试用例,可以帮助我们窥探源码的秘密.以下使用来测试类加载器的一个测试用例.类加载器也是对象,他们用来将类从类从.class文件加载到虚拟机,这些已经讲了很多,深入jvm中说的很详细,什么双亲委派模型,在书中还以tomcat为例讲解. /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the N