------- android培训java培训、期待与您交流!

--------

类载入器

Java虚拟机中能够安装多个类载入器,系统默认三个主要类载入器,每一个类负责载入特定位置的类:

BootStrap      ExtClassLoader     AppClassLoader

类载入器有什么作用?

当程序须要的某个类,那么须要通过类载入器把类的二进制载入到内存中,类载入器也是Java类

类载入器也是java类,由于其它是java类的类载入器本身也要被类载入器载入。显然必须有第一个类载入器不是java类。这正是BootStrap

Java虚拟机中的全部类载入器採用具有父子关系的树型结构进行组织。在实例化每一个类载入器对象时,须要为其指定一个父级类载入器对象或者默认採用系统类载入器为其父级类载入器。

类载入器的托付机制:

当java虚拟机要载入一个类时,究竟派出哪个类载入器去载入呢?

(1)  首先当前线程的类载入器去载入线程中的第一个类

(2)  假设类A中引用了类B,java虚拟机将使用载入类A装载器来载入类B

(3)  还能够直接调用ClassLoader.loadClass()方法来指定某个类载入器去载入某个类

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5zaXN0T3du/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

面试题:能不能自己写个类java.lang.System?

通常不能够写。由于类载入器採用托付机制,这样保证了父类优先,也就是说总是使用父类能找到的类,这样总是使用java系统提供的System

编写自己的类载入器

知识解说:

(1)  自己定义的类载入器必须继承ClassLoader

(2)  覆写loadClass()方法下的findClass方法,由于要保留loadClass中的机制

(3)  defineClass方法

编程步骤:

(1)  编写一个对文件内容进行简单加密的程序

(2)  编写一个自己的类载入器,可实现对加密过的类进行装载和解密

(3)  编写一个程序调用类载入器载入类。在源程序中不能用该类名定义引用变量,由于编译器无法识别这个类。

程序中能够除了使用ClassLoader。load方法之外,还能够使用设置线程的上下文类载入器或者系统类载入器,然后再使用Class.forName

实验步骤:

(1)  对不带包名的class文件进行加密。加密结果存放到另外一个文件夹,比如,java MyClassLoader MyTest.class F:\itcast

(2)  执行载入类的程序,结果可以被正常载入,但打印出来的类装载器名称为AppClassLoader:java MyClassLoader MyTest F:\itcast

(3)  用加密后的类文件替换CLASSPATH环境下的类文件,再运行上一步操作就出问题了,错误说明是AppClassLoader类载入器装载失败

(4)  删除CLASSPATH环境下的类文件,再运行上一步操作就没问题了

编写自己的类载入器

public static void main(String[] args) throws Exception {

String srcPath = args[0];

String destDir = args[1];

FileInputStream fis = new FileInputStream(srcPath);

String destFileName = srcPath.substring(srcPath.lastIndexOf('\\')+1);

String destPath = destDir + "\\" + destFileName;

FileOutputStream fos = new FileOutputStream(destPath);

cypher(fis,fos);

fis.close();

fos.close();

}

/**

* 加密方法,同一时候也是解密方法

* @param ips

* @param ops

* @throws Exception

*/

private static void cypher(InputStream ips ,OutputStream ops) throws Exception{

int b = -1;

while((b=ips.read())!=-1){

ops.write(b ^ 0xff);//假设是1就变成0,假设是0就变成1

}

}

然后在新建一个类,通过上面的方法将新建的类的字节码进行加密:

public class ClassLoaderAttachment extends Date {

public String toString(){

return "hello,itcast";

}

}

那么这就须要使用我们自己的类载入器来进行解密了.

public class MyClassLoader extends ClassLoader{

public static void main(String[] args) throws Exception {

String srcPath = args[0];

String destDir = args[1];

FileInputStream fis = new FileInputStream(srcPath);

String destFileName = srcPath.substring(srcPath.lastIndexOf('\\')+1);

String destPath = destDir + "\\" + destFileName;

FileOutputStream fos = new FileOutputStream(destPath);

cypher(fis,fos);

fis.close();

fos.close();

}

private static void cypher(InputStream ips ,OutputStream ops) throws Exception{

int b = -1;

while((b=ips.read())!=-1){

ops.write(b ^ 0xff);//假设是1就变成0,假设是0就变成1

}

}

private String classDir;

@Override

protected Class<?> findClass(String name) throws ClassNotFoundException {

String classFileName = classDir + "\\" + name.substring(name.lastIndexOf('.')+1) + ".class";

try {

FileInputStream fis = new FileInputStream(classFileName);

ByteArrayOutputStream bos = new ByteArrayOutputStream();

cypher(fis,bos);

fis.close();

System.out.println("aaa");

byte[] bytes = bos.toByteArray();

return defineClass(bytes, 0, bytes.length);

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

public MyClassLoader(){

}

public MyClassLoader(String classDir){

this.classDir = classDir;

}

}

測试执行代码:

Class clazz = new MyClassLoader("myClass").loadClass("ClassLoaderAttachment");

//此处不能在使用ClassLoaderAttachment由于一旦用了之后,

//系统的类载入器就会去载入,导致失败,所以该类就继承了Date类了.

Date date = (Date)clazz.newInstance();

System.out.println(date);

执行结果:

------- android培训java培训、期待与您交流!

--------

黑马程序猿——Java中的类载入器的更多相关文章

  1. 黑马程序猿————Java基础日常笔记---反射与正則表達式

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...

  2. 黑马程序猿——JAVA高新技术——反射

    ----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 一.对于反射的概念 对于JAVA反射机制是在执行状态中,对于随意一个类.都可以知道 ...

  3. 黑马程序猿——JAVA基础——集合

    ----------android培训.java培训.java学习型技术博客.期待与您交流.------------  一.关于java中的集合类        首先看一下,大致的框架流程图     ...

  4. 黑马程序猿——java基金会--jdk、变量

    学习内容: 1.Java发展历史 2.jdk和jre的差别,功能. 3.jdk和jre的下载和安装 4.配置环境.path和classpath 5.helloworld程序 6.进制之间的转换 7.凝 ...

  5. 黑马程序猿——————java基础

    一.软件开发 软件是什么? 软件是简单的来说,计算机数据和指令的集合,数据(比方年龄,性别).指令及时告诉计算机怎样对他进行处理.计算机但是没有人那么聪明啊! 二.图形化界面(GUI),主要特点就是. ...

  6. 黑马程序猿——JAVA面向对象的特性:封装,继承,多态

                                           - ----------android培训.java培训.java学习型技术博客.期待与您交流!------------  ...

  7. 黑马程序猿——JAVA基础——IO流

    ----------android培训.java培训.java学习型技术博客.期待与您交流!------------  一. 一.IO流的三种分类方式 1.按流的方向分为:输入流和输出流 2.按流的数 ...

  8. 黑马程序猿-----Java之你不得不知道的排序

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  9. 黑马程序猿 ---------- Java网络技术之 ---正則表達式 (Day06)

    ---------------------- ASP.Net+Unity开发..Net培训.期待与您交流. ---------------------- 正則表達式 正則表達式:基本知识 1  字符, ...

随机推荐

  1. STM32固件库

    一.STM32固件库开发和传统寄存器开发方式的区别 二.CMSIS标准 CMSIS标准--Cortex Microcontroller Software Interface Standard,是ARM ...

  2. makefile debug

    1. 使用warning指令 warning 是个不错的命令,可以打印出消息,来判断makefile执行的流程 2.使用ifeq ifneq 当makefile被多次调用到的时候,如果都输出warni ...

  3. 《Linux命令行大全》系列(二、导航)

    文件系统的导航,是一个不断访问树形结构中节点的过程. 文件系统树 Linux只有一个倒立的文件系统树 不同设备可以挂载到这同一个树上 文件和子目录是此树的组成部分,最顶层的即根目录 目录 根据树节点间 ...

  4. Torch vs Theano

    Torch vs Theano Recently we took a look at Torch 7 and found its data ingestion facilities less than ...

  5. spring 属性配置细节

    1.使用构造器注入属性值可以指定参数的位置和参数的类型!以区分重载的构造器.例如:<constructor-arg value="" type="java.lang ...

  6. 使AspNetPager控件中文显示分页信息

    在日常的编程过程中,很多学员对于使AspNetPager控件中文显示分页信息不是很清楚,本文将由达内的老师为各位学员介绍一下使AspNetPager控件中文显示分页信息的内容. AspNetPager ...

  7. 【POJ 3487】 The Stable Marriage Problem (稳定婚姻问题)

    The Stable Marriage Problem   Description The stable marriage problem consists of matching members o ...

  8. [topcoder]KingdomReorganization

    http://community.topcoder.com/stat?c=problem_statement&pm=11282&rd=14724 这道题是最小生成树,但怎么转化是关键. ...

  9. VirtualBox设置共享文件夹和镜像访问的方法

    VirtualBox设置共享文件夹和镜像访问的方法 virtualBox是一款虚拟机软件,可以在该软件上安装各类的操作系统,至于如何安装请参见另外一篇经验<如何使用VirtualBox安装win ...

  10. Rocky(dfs)

    题目描述 Sylvester Stallion is an old horse who likes nothing better than to wander around in the fields ...