`
javafenger
  • 浏览: 246793 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

java类加载的表现形式

阅读更多
       java中的类是动态加载的,我们先看一下我们常用的类加载方式,先有一个感性的认识,才能进一步
深入讨论,类加载无非就是下面三种方式。
class A{}
class B{}
class C{}
public class Loader{
    public static void main(String[] args) throws Exception{
       Class aa=A.class;
       Class bb=Class.forName("B");
       Class cc=ClassLoader.getSystemClassLoader().loadClass("C");
    }
}
我们先看.class字面量方式,很多人可能不知道这种方式,因为这种用法不是一般java语法。
通过javap我们可以发现,这种方式的大致等价于定义了一个静态成员变量
    static Class class$0;(后面的编号是增长的)
你可以试图再定义一个  static Class class$0,应该会收到一个编译错误(重复定义)。
Class aa=A.class;
就相当于
    if(class$0==null){
 try{
           Class.forName("A");
 }
 cacth(ClassNotFoundException e){
    throw new NoClassDefFoundError(e);
 }
    }
    Class aa=class$0;
可以很清楚的看到,这种类的字面量定义其实不是加载类的方式,而是被编译器处理了,实质
上是使用了Class.forName方法,但是使用这种方式有一个很大的好处就是不用处理异常,因为
编译器处理的时候如果找不到类会抛出一个NoClassDefFoundError。也许你觉得需要处理
ClassNotFoundException这种异常,事实上99%的情况下我们可以把这种异常认为是一个错误。
所以大部分情况我们使用这种方式会更简洁。
最常用的方式就是Class.forName方式了,这也是一个通用的上层调用。这个方法有两个重载,
可能很多人都忽略了第二个方法。
public static Class forName(String name) throws ClassNotFoundException
public static Class forName(String name, boolean initialize,ClassLoader loader) throws ClassNotFoundException
第二个方法后面多了两个参数,第二个参数表示是否初始化,第三个参数为指定的类加载器。
在上面的例子中:
Class bb=Class.forName("B");等价于
Class bb=Class.forName("B",true,Loader.class.getClassLoader());
这里要详细说一下这个类的初始化这个参数,如果这个参数为false的话,
类中的static成员不会被初始化,static语句块也不会被执行。
也就是类虽然被加载了,但是没有被初始化,不过在第一次使用时仍然会初始化。
所以我们有时候会看到Class.forName("XXX").newInstance()这样的语句,为什么这里要创建一个
不用的实例呢?不过是为了保证类被初始化(兼容以前的系统)。
其实第二个方法是比较难用的,需要指定类加载器,如果不指定而且又没有安装安全管理器的化,
是无法加载类的,只要看一下具体的实现就明白了。
最本质的方式当然是直接使用ClassLoader加载了,所有的类最终都是通过ClassLoader加载的,
Class cc=ClassLoader.getSystemClassLoader().loadClass("C");
这里通过使用系统类加载器来加载某个类,很直接的方式,但是很遗憾的是通过这种方式加载类,
类是没有被初始化的(也就是初始化被延迟到真正使用的时候).不过我们也可以借鉴上面的经验,加载
后实例化一个对象Class cc=ClassLoader.getSystemClassLoader().loadClass("C").newInstance()。
这里使用了系统类加载器,也是最常用的类加载器,从classpath中寻找要加载的类。
java中默认有三种类加载器:引导类加载器,扩展类加载器,系统类加载器。
java中的类加载有着规范的层次结构,如果我们要了解类加载的过程,需要明确知道哪个类被谁
加载,某个类加载器加载了哪些类等等,就需要深入理解ClassLoader的本质。
以上只是类加载的表面的东西,我们还将讨论深层次的东西。

相关推荐

    Linux下Java开发环境搭建以及加载C++动态库方法

    ### Linux 下 Java 开发环境搭建及 C++ 动态库加载方法详解 #### 一、Linux 下 Java 开发背景 Java 作为一种广泛使用的编程语言,其设计初衷是实现一次编写,到处运行的目标,即跨平台特性。这使得 Java 程序能够...

    java的运行机制

    本文将从Java的编译与执行、JVM(Java虚拟机)的作用、类加载器(ClassLoader)的工作原理以及JRE(Java运行时环境)与JDK(Java开发工具包)的区别等方面进行详细的阐述。 #### 1. Java的编译与执行 Java是一种半...

    Java 自省类教程

    `Class`类是自省的基础,代表一个类或基本类型的运行时表示形式。可以通过多种方式获取`Class`对象: - **通过对象**: `getClass()` - **通过类名**: `Class.forName("fully.qualified.ClassName")` - **通过类**: ...

    java 技术总结.--java 技术

    多态则允许同一种行为在不同对象上有不同的表现形式,增强了程序的灵活性。 三、异常处理 Java提供了异常处理机制,通过try-catch-finally语句块捕获和处理程序运行时可能出现的错误。这有助于提高程序的健壮性和可...

    Java编程的逻辑

    13. **JVM和内存管理**:了解Java虚拟机(JVM)的工作原理,包括类加载、垃圾回收等,对优化程序性能至关重要。 14. **单元测试**:JUnit是Java常用的单元测试框架,编写测试用例可以确保代码质量,减少bug的出现。...

    Java入门[已破解]

    多态是指同一种行为可以有不同的表现形式,这在接口或抽象类的实现中体现得尤为明显。 4. **异常处理**:Java通过try-catch-finally语句块来处理程序运行时可能出现的错误,以确保程序的健壮性。 5. **集合框架**...

    java基础课件 ppt

    多态则是指同一种行为可以有多种不同的表现形式,增强了代码的灵活性。 5. **异常处理**:Java通过try-catch-finally结构来捕获和处理运行时错误,使得程序更健壮。 6. **集合框架**:Java集合框架包括接口(如...

    java学习资料包

    - **多态**:同一种行为可以有多种表现形式,提高代码的灵活性。 - **抽象**:通过抽象类和接口来定义行为规范,不关心具体实现。 3. **异常处理** - Java中的异常处理机制是通过try-catch-finally语句块来实现...

    java黑马笔记.rar

    - **多态**:同一种行为在不同对象上有不同的表现形式,通过接口、抽象类和方法重写实现。 4. **异常处理**: Java使用try-catch-finally结构来捕获和处理程序运行时可能出现的错误,提供了一种系统化的异常处理...

    java入门精典源代码

    多态则指同一种行为可以有不同的表现形式。在学习过程中,你可能还会接触到接口、抽象类以及访问修饰符等概念。 异常处理是Java程序健壮性的重要组成部分。Java提供了try-catch-finally结构来捕获和处理运行时错误...

    java开发参考手册

    多态则是指同一种行为可以有多种不同的表现形式。 4. **异常处理**:Java提供了异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误。理解Checked异常和Unchecked异常的区别,以及如何使用throws...

    达内java培训笔记

    多态性使得同一种行为可以有不同的表现形式,增强了代码的灵活性。 三、异常处理 Java异常处理是程序健壮性的关键。通过try-catch-finally结构捕获和处理运行时错误,确保程序即使在出现异常的情况下也能优雅地终止...

    Java基础,Java入门

    多态是指同一种行为在不同对象上有不同的表现形式,增强了代码的灵活性。 5. **异常处理**:Java通过try-catch-finally结构来捕获和处理运行时错误,以防止程序意外终止。异常分为检查型异常(编译时必须处理)和非...

    freemarker java解析依赖工具类.zip

    它的核心理念是分离业务逻辑和表现形式,使得开发者可以专注于数据的处理,而设计师则可以专注于页面的布局和设计。 1. **Freemarker模板语言**:Freemarker模板由普通的文本和控制结构(如条件语句、循环)组成,...

    java课件 老师上课讲学的

    多态则是指同一种行为可以有不同的表现形式,增强了程序的灵活性。 3. **类与对象**:学习Java需要理解类的定义、对象的创建和使用。类是对象的模板,定义了对象的状态(属性)和行为(方法)。通过实例化类来创建...

    Java常见问题排查

    **表现形式:** - HTTP响应返回499、502、504等错误码。 **排查方法:** - **死锁检测:** 使用`jstack –l`命令打印线程堆栈信息,寻找互相等待锁的线程。 - **线程池状态:** 使用`jstack`命令检查特定线程池中...

    Java Reflection In Action

    1. **Class类**:表示一个类的运行时表现形式,可以通过它获取类的所有信息。 2. **Field类**:表示类的成员变量(包括实例变量和静态变量),可以用来获取和设置变量值。 3. **Method类**:表示类的方法,可以用来...

Global site tag (gtag.js) - Google Analytics