黑马程序员_Java虚拟机的学习
来源:互联网 发布:淘宝怎样设置货到付款 编辑:程序博客网 时间:2024/05/23 11:53
-----------------------------android培训、java培训、期待与您交流!----详细请查看:http://edu.csdn.net/heima---------------
JVM
1. ClassLoader(类加载器)
2. JVM 提供了三种类加载器
1) 根类加载器(使用C++编写,程序员无法在 Java 代码中获得该类)
2) 扩展加载器,使用 Java 代码实现
3) 系统加载器(应用加载器) ,使用Java 代码实现
3. 用户自定义的类加载器都是 java.lang.ClassLoader 的子类
4 调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化。例如:
package com.shengsiyuan.classloader;
class CL
{
static
{
System.out.println("Class CL");
}
}
public class Test7
{
publicstatic void main(String[] args) throws Exception
{
// 获得系统类加载器
ClassLoader loader =ClassLoader.getSystemClassLoader();
Class<?>clazz = loader.loadClass("com.shengsiyuan.classloader.CL");//加载类
//调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化,
System.out.println("----------------------------");
clazz =Class.forName("com.shengsiyuan.classloader.CL");//给类实例化
}//此时 是对类的主动使用,返回一个类的实例,会导致类的初始化。不在用New对象
结果是:
-------------------
Class CL
5 父子加载器并非继承关系,也就是说子加载器不一定是继承了父加载器。是一种组合的关系。除了以上虚拟机自带的加载器外,用户可以自定义加载器(User-defined Class Loader),Java提供了抽象类java.lang.ClassLoader,所有的用户自定义的类加载器应继承ClassLoader类。
6 当生成一个自定义的类加载器实例时,如果没有指定它的父加载器,那么系统类加载器就将成为该类加载器的父加载器。
7
自定义一个加载器
public class MyClassLoader extendsClassLoader
{
privateString name; //类加载器的名字
privateString path = "d:\\"; // 加载类的路径
privatefinal String fileType = ".class"; // class文件的扩展名
publicMyClassLoader(String name)
{
super(); // 让系统类加载器成为该类加载器的父加载器
his.name = name;
}
publicMyClassLoader(ClassLoader parent, String name)
{
super(parent); // 显式指定该类加载器的父加载器
this.name = name;
}
@Override
publicString toString()
{
return this.name;
}
publicString getPath()
{
return path;
}
publicvoid setPath(String path)
{
this.path = path;
}
@Override
public Class<?>findClass(String name) throws ClassNotFoundException//按指定方式将一个字节数组转化字节对象。返回一个class对象。
{
byte[] data = this.loadClassData(name);
return this.defineClass(name, data, 0,data.length);
}
privatebyte[] loadClassData(String name)
{
InputStream is = null;
byte[] data = null;
ByteArrayOutputStream baos = null;
try
{
this.name= this.name.replace(".", "\\");
is= new FileInputStream(new File(path + name + fileType));
baos= new ByteArrayOutputStream();
intch = 0;
while(-1!= (ch = is.read()))
{
baos.write(ch);
}
data= baos.toByteArray();
}
catch(Exception ex)
{
ex.printStackTrace();
}
finally
{
try
{
is.close();
baos.close();
}
catch(Exceptionex)
{
ex.printStackTrace();
}
}
return data;
}
public static void main(String[] args) throwsException
{
MyClassLoader loader1 = new MyClassLoader("loader1");
loader1.setPath("d:\\myapp\\serverlib\\");
MyClassLoader loader2 = newMyClassLoader(loader1, "loader2");
loader2.setPath("d:\\myapp\\clientlib\\");
//
// MyClassLoader loader3 = newMyClassLoader(null, "loader3");
//
// loader3.setPath("d:\\myapp\\otherlib\\");
//
// test(loader2);
//
// System.out.println("----------");
//
// test(loader3);
Class clazz =loader1.loadClass("Sample");//加载类
Object object =clazz.newInstance(); //创建一个Sample类的对象,实例
Sample sample = (Sample)object;//向下类型转换
System.out.println(sample.v1);//通过反射可以突破不同的命名空间的限制,加载器加载类。
-----------------------------android培训、java培训、期待与您交流!----详细请查看:http://edu.csdn.net/heima---------------
- 黑马程序员_Java虚拟机的学习
- 黑马程序员_java的注解学习_04
- 黑马程序员_java虚拟机,一些变量的说明
- 黑马程序员_java基础学习
- 黑马程序员_java学习_01
- 黑马程序员_java IO学习
- 黑马程序员_java反射学习
- 黑马程序员_java多线程学习
- 黑马程序员_Java Annotation学习
- 黑马程序员_java mail学习
- 黑马程序员_java学习笔记
- 黑马程序员_java基础知识学习
- 黑马程序员_Java多线程学习
- 黑马程序员_JAVA反射学习
- 黑马程序员_JAVA的IO
- 黑马程序员_java的由来
- 黑马程序员_Java的封装
- 黑马程序员_Java的基本常识
- 基于Udp的Socket网络编程
- 鼠标键盘事件
- ADO.NET相关书籍
- 通过JS控制CSS实现连帧动画
- 通过接口获取大量数据,内存溢出的问题
- 黑马程序员_Java虚拟机的学习
- SSI框架搭建相关问题
- 练习:打开,保存文件
- java继承 父类子类方法调用问题 属性和静态方法是没有多态的
- 正则表达式简单验证内容中的括号是否配对
- snprintf、stringstream、strstream的对比分析
- 基于Udp的Socket网络编程聊天程序
- hibernate继承关系映射
- 黑马程序员_各种方法解析XML文件学习