`
oywl2008
  • 浏览: 1051746 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java loader 类装载器

 
阅读更多

几乎所有的系统都需要通过获取配置/资源文件来方便配置系统
但怎样获取资源文件呢
java的应用通常把配置文件和工程中的其他class放在一起(如log4j),原因是可以方便的使用classLoader的 getResourceAsStream()方法获取资源(其实java内部就是这样来
load class的),下面是一个简单例子:
比如你把文件(abc.properties)放到com.yourcompany.common包里面,在确保classpath包括该包的情况
下就可以按下面的方法获取资源
ClassLoader cl = this.getClass().getClassLoader();
InputStream is = cl.getResourceAsStream("com/yourcompany/"+abc.properties)
进一不,如果abc.properties是一个标准的properties文件的话,比如其内容如下
messageA = Ok!
还可以这样获取配置信息
Properties props = new Properties();
props.load(is);
String messageA = props.getProperty("messageA ");
则messageA== "Ok"
当然properties也可以是XML格式,只要他符合http://java.sun.com/dtd/properties.dtd的规范并且包含
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">的DOCTYPE declaration,就可以用props.loadFromXML(InputSteam in)方法载入property
ps:property 也提供store()和storeToXML方法保存属性
关于classLoader也可以看看 

classloader相关基础知识

    JVM
    jvm是jre里头一个动态连接函数库,jdk里面的jre一般用于运行java本身的程序,比如javac,等等.programfiles下面的jre用于运行用户编写的java程序.
    JRE下的bin\client 或者 bin\server 的jvm.dll就是JVM了

    当一台机器上有多个jvm可选择的时候,jvm的选择步骤:
    1)当前目录有没有jre目录(不准确),
    2)父目录下的jre子目录
    3)注册表HEKY_LOCAL_MACHINE\SoftWare\Java\Java Runtime Environment\
    所以当运行的是jdk\bin\java.exe的时候,用的jre是bin的父目录jdk下面的jre\
    运行java.exe找到了jre后有一个验证程序,验证jre和java.exe的版本是否一致,如果不一致则会发生错误


    java -verbose:class Main 显示调用的详细信息


    classloader的两种载入方式:1)pre-loading预先载入,载入基础类 2)load-on-demand按需求载入
    只有实例化一个类才会被classloader载入,仅仅申明并不会载入


    java动态载入class的两种方式:
    1)implicit隐式,即利用实例化才载入的特性来动态载入class
    2)explicit显式方式,又分两种方式:
    1)java.lang.Class的forName()方法
    2)java.lang.ClassLoader的loadClass()方法


    static块在什么时候执行?
    1)当调用forName(String)载入class时执行,如果调用ClassLoader.loadClass并不会执行.forName(String,false,ClassLoader)时也不会执行.
    2)如果载入Class时没有执行static块则在第一次实例化时执行.比如new ,Class.newInstance()操作
    3)static块仅执行一次



    Class类的实例.
    >>Class类无法手工实例化,当载入任意类的时候自动创建一个该类对应的Class的实例,
    >>某个类的所有实例内部都有一个栏位记录着该类对应的Class的实例的位置.,
    >>每个java类对应的Class实例可以当作是类在内存中的代理人.所以当要获得类的信息(如有哪些类变量,有哪些方法)时,都可以让类对应的Class的实例代劳.java的Reflection机制就大量的使用这种方法来实现
    >>每个java类都是由某个classLoader(ClassLoader的实例)来载入的,因此Class类别的实例中都会有栏位记录他的ClassLoader的实例,如果该栏位为null,则表示该类别是由bootstrap loader载入的(也称root laoder),bootstrap loader不是java所写成,所以没有实例.

    原生方法:forName0()等方法,native修饰符


    自定义ClassLoader:
    如实例化一个URLClassLoader. URLClassLoader ucl = new URLClassLoader(new URL[]{new URL("file:/e:/bin/")}),URLClassLoader优先找当前目录,再在url中找.class加载.URL中别忘在最后加"/"表示目录


    各个java类由哪些classLoader加载?
    1)java类可以通过实例.getClass.getClassLoader()得知
    2)接口由AppClassLoader(System ClassLoader,可以由ClassLoader.getSystemClassLoader()获得实例)载入
    3)ClassLoader类由bootstrap loader载入


    ClassLoader hierachy:
    jvm建立->初始化动作->产生第一个ClassLoader,即bootstrap loader->bootstrap loader在sum.misc.Launcher类里面的ExtClassLoader,并设定其Parent为null->bootstrap loader载入sun.misc.Launcher$AppClassLoader,并设定其parent为ExtClassLoader(但是AppClassLoader也是由bootstrap loader所载入的)->AppClassLoader载入各个xx.class,xx.class也有可能被ExtclassLoader或者bootstrap loader载入.
    >>自定义的ClassLoader的.getParent()是AppClassLoader.parent和他的加载器并没有关系
    >>ExtClassLoader和AppClassLoader都是URLClassLoader的子类.AppClassLoader的URL是由系统参数java.class.path取出的字符串决定,而java.class.path由 运行java.exe时 的-cp或-classpath或CLASSPATH环境变量决定
    >>ExtClassLoader查找的url是系统变量java.ext.dirs,java.ext.dirs默认为jdk\jre\lib\ext
    >>Bootstrap loader的查找url是sun.boot.class.path
    >>在程序运行后调用System.setProperty()来改变系统变量并不能改变以上加载的路径,因为classloader读取在System.setProperty之前.sun.boot.class.path是在程序中写死的,完全不能修改

    委派模型
    当classloader有类需要载入时先让其parent搜寻其搜寻路径帮忙载入,如果parent找不到,在由自己搜寻自己的搜寻路径载入,ClassLoader hierachy本来就有这种性质



    NoClassDefFoundError和ClassNotFoundException
    NoClassDefFoundError:当java源文件已编译成.class文件,但是ClassLoader在运行期间在其搜寻路径load某个类时,没有找到.class文件则报这个错
    ClassNotFoundException:试图通过一个String变量来创建一个Class类时不成功则抛出这个异常
分享到:
评论

相关推荐

    Java的类装载器和命名空间

    Java的类装载器分为两大类:启动类装载器(Bootstrap ClassLoader)和用户自定义装载器(User-Defined Class Loader)。 - **启动类装载器**:由JVM自身实现,主要负责加载JDK的核心类库,如rt.jar中的java.lang.*...

    Java深度历险(2)--深入类装载器

    类装载器(Class Loader)是Java虚拟机(JVM)的核心组成部分之一,负责将类文件加载到JVM中,以便它们可以被执行。在Java中,每个类都是由类装载器加载到JVM中的,并且每个类都由特定的类装载器实例加载。类装载器...

    WAS+V7+理解类装入器-红皮书.pdf

    1. **引导程序类装载器(Bootstrap Class Loader)**:这是默认的第一个类装载器,用于加载Java的核心类库,如`java.lang`包中的类。引导程序类装载器是由JVM本身实现的,并不是通过Java语言编写的,而是由本地代码...

    java中四个核心思想

    - **启动类装载器(Bootstrap Class Loader)**:这是系统级的类装载器,用于装载Java的核心类库,如`java.lang.*`等,它是所有其他类装载器的父类装载器。 - **扩展类装载器(Extension Class Loader)**:用于装载扩展...

    Java虚拟机class文件原理

    Java中的所有类都必须先被装载到JVM中才能被执行,这个过程由JVM内的类装载器(ClassLoader)来完成。类装载器的工作是将类文件从硬盘读取到内存中,使得JVM能够识别和执行这些类。 Java类大致分为三类:系统类、...

    深入了解 java 虚拟机

    JVM主要包括类装载器(Class Loader)、运行时数据区(Runtime Data Area)、执行引擎、本地方法接口(Native Method Interface)和本地库。其中,类装载器负责加载类文件,确保程序能够正确运行;运行时数据区则...

    JBoss管理与开发

    - **Bootstrap Class Loader**:这是JVM自带的类装载器,负责加载Java核心库中的类。 - **Extension Class Loader**:它由`sun.misc.Launcher$ExtClassLoader`实现,负责加载扩展目录下的类。 - **Application Class...

    Java四大核心技术思想详解.doc

    2. **扩展类装载器(Extension Class Loader)**:由`sun.misc.Launcher$ExtClassLoader`实现,负责加载扩展目录`$JAVA_HOME/jre/lib/ext`下的jar包。 3. **应用类装载器(Application Class Loader)**:也称为...

    大学课程讲义-Java基础-反射.pptx

    JVM规范定义了两种类型的类装载器:启动类装载器(bootstrap)和用户自定义装载器(user-defined class loader)。JVM在运行时会产生3个类加载器组成的初始化加载器层次结构。 * 引导类加载器(Bootstrap ClassLoader)...

    JVM加载class文件的原理机制

    JVM加载class文件的原理机制是Java中的核心机制之一,由于Java中的所有类必须被装载到JVM中才能运行,这个装载工作是由JVM中的类装载器完成的。类装载器所做的工作实质是把类文件从硬盘读取到内存中。 类加载机制 ...

    Java中的四个核心技术

    - **启动类装载器(Bootstrap ClassLoader)**:这是最顶层的类装载器,负责加载JVM核心类库,如`java.lang.*`等包中的类。 - **扩展类装载器(Extension ClassLoader)**:这个类装载器负责加载扩展目录下的jar包。...

    java 命名空间 命名规则

    在Java虚拟机(JVM)中,类装载器(Class Loader)扮演着极其重要的角色,它的主要职责是根据给定的全限定类名(Fully Qualified Class Name)来加载类的二进制流到JVM内存中。JVM规范定义了两类主要的类装载器: 1. **...

    java概述课件24反射.ppt

    类的加载过程涉及Bootstrap Loader(启动类装载器)、ExtClassLoader(扩展类装载器)和AppClassLoader(应用程序类装载器)。Bootstrap Loader负责加载JDK目录下的类库,ExtClassLoader加载系统类路径指定的类库,...

    Java虚拟机(不错的)

    1. **类装载器(Class Loader)**:负责加载Java类到JVM中,这个过程包括加载、验证和准备三个步骤。类装载器按照双亲委托模型工作,确保类的唯一性。 2. **运行数据区(Runtime Data Areas)**:包括程序计数器、...

    Core Java面试重点知识总结

    1. 类装载器(Class loader)子系统:它的主要任务是根据类的全限定名(如`java.lang.Object`)加载对应的.class文件内容到运行时数据区域的方法区。Java程序员可以继承`java.lang.ClassLoader`来定制自己的类装载器...

    深入拆解 Java 虚拟机.zip

    1. 类装载器(Class Loader):负责加载类文件,将二进制数据转化为Java对象。分为引导类装载器、扩展类装载器和应用程序类装载器,它们遵循双亲委托模型进行工作。 2. 运行时数据区(Runtime Data Area):包括...

    ClassLoader in OSGI

    - `ExtClassLoader's father classLoader is: null`:扩展装载器的父加载器为启动类加载器`BootstrapClassLoader`,由于后者不是标准的Java类,因此显示为`null`。 #### 三、ClassLoader装载策略 从Java 1.2版本...

    Java运行原理与Java虚拟机.pdf

    1. **类装载器(Class Loader)**:负责加载程序运行所需的所有类。当程序请求加载一个类时,类装载器会查找并加载相应的字节码文件。类装载器能够根据需要动态加载类,从而支持程序的热更新。 2. **内存管理**:JVM...

    MiniJavaVM—个Java虚拟机的设计和实现

    1. 加载器(Loader):负责将 Java 字节码加载到虚拟机中。 2. 解释器(Interpreter):负责将 Java 字节码翻译成机器码。 3. 执行引擎(Execution Engine):负责执行机器码。 4. 运行时数据区(Runtime Data Area...

Global site tag (gtag.js) - Google Analytics