一:Java虚拟机中能够安装多个类载入器,系统默认是三个基本的类载入器:

Bootstrap  ExtClassLoader  AppClassLoader

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

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

父子关系及管辖范围:

BootStrap  -------------------------->JRE/lib/rt.jar

ExtClassLoader------------------->JRE/lib/ext/*.jar

AppClassLoader------------------>ClassPath指定的全部jar或文件夹

三:类载入器托付机制

一级一级从上往下寻找,优先级从高往低载入。

当Java虚拟机须要载入一个类时,首先当前线程的类载入器去载入线程中的第一个类,通过Thread.setContextClassLoader(CloassLoader());指定。

假设类A中引用(继承等..)了类B,Java虚拟机将使用载入类A的类载入器来载入类B。还能够调用ClassLoader.loaderClass()方法来指定类载入器。

四:编写自己的类载入器

类继承ClassLoader   覆盖findClass()方法    defineClass()将字节码转换成Class对象

/*
* 自己定义类载入器
*/
public class MyClassLoader extends ClassLoader{ public static void main(String[] args) throws Exception {
String srcPath = args[0];
String destPath = args[1];
FileInputStream fis = new FileInputStream(srcPath);
FileOutputStream fout = new FileOutputStream(destPath);
cypher(fis, fout);
fis.close();
fout.close();
} //重写findClass()方法
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
// TODO Auto-generated method stub
return super.findClass(name);
} // 加密方法
private static void cypher(InputStream inps, OutputStream outs)
throws Exception {
int b = -1;
while ((b = inps.read()) != -1) {
outs.write(b ^ 0xff);
}
}
}

最新文章

  1. 使用jquery.qrcode生成二维码(转)
  2. java 文件上传
  3. Thinkphp:有你真好
  4. cocos2d-x之初试内存管理机制
  5. BZOJ2490 Zombie’s Treasure Chest
  6. 2013-07-29 IT 要闻速记快想
  7. 玩转Android之Drawable的使用
  8. REDIS主从配置及切换
  9. 关于oracle数据库(4)数据类型
  10. Java接口-----代理模式(Proxy)
  11. Java设计模式(八)Proxy代理模式
  12. 洛谷3794 签到题IV
  13. ACM Tempter of the Bone
  14. 11. IDS (Intrusion detection systems 入侵检测系统 6个)
  15. 每天学点SpringCloud(七):路由器和过滤器-Zuul
  16. Install latest git on CentOS 6/7
  17. 如何自定义一个组件loading
  18. angular的启动原理
  19. java将doc文件转换为pdf文件的三种方法
  20. hdu 4961 Boring Sum(高效)

热门文章

  1. DEDECMS之0day入侵总结
  2. Listener监听器之HttpSessionListener
  3. Yii2系列教程二:MVC,Forms和Layouts
  4. 在Docker中从头部署自己的Spark集群
  5. asp.net权限控制的方式
  6. 解决spring boot启动报错java.lang.NoClassDefFoundError: ch/qos/logback/classic/Level
  7. IOS Appstore价格表
  8. Json_decode:详解
  9. iOS 使用AFNetWorking监听APP网络状态变化(可用于更改缓存策略、提示网络等)
  10. Centos下Subversion 服务器安装配置