`
xingsan_zhang
  • 浏览: 55432 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java基础知识——类装载器与反射机制

    博客分类:
  • Java
阅读更多

类装载器ClassLoader

类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示的对象组件。

类装载器把一个类装入JVM中,要经过三步:

1.装载:查找和导入Class文件;

2.链接:执行校验、准备和解析(解析是可以选择的);

3.初始化:对类的静态变量、静态代码块执行初始化工作;

 

类装载工作由ClassLoader及其子类负责。JVM在运行时会产生三个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)和AppClassLoader(系统类装载器)。

根装载器不是ClassLoader的子类,它使用C++编写,因此,我们在JAVA中看不到它,根装载器负责装载JRE的核心类库,如JRE目标下的rt.jarcharsets.jar等。

ExtClassLoaderAppClassLoader都是ClassLoader的子类。其中,ExtClassLoader负责装载JRE扩展目录ext中的类包,AppClassLoader负责装载Classpath路径下的类包。

这三个类装载器之间存在父子层级关系,即根装载器是ExtClassLoader的父装载器,ExtClassLoaderAppClassLoader的父装载器。

 

public class ClassLoaderTest {

    public staticvoid main(String[] args) {

        ClassLoader loader = Thread.currentThread().getContextClassLoader();

        System.out.println("current loader---"+loader);

        System.out.println("parent loader---"+loader.getParent());

        System.out.println("grandparent loader---"+loader.getParent().getParent());

    }

}

 

上面代码运行结果:

current loader---sun.misc.Launcher$AppClassLoader@20cf2c80

parent loader---sun.misc.Launcher$ExtClassLoader@1729854

grandparent loader---null

 

由于根加载器在java中访问不到,所以返回null

 

每一个类在JVM中都拥有一个对应的java.lang.Class对象,它提供了类结构信息的描述。Class对象是在装载类时由JVM通过调用类装载器中的defineClass()方法自动构造的。

 

Java反射机制

Class反射对象描述类语义结构,可以从Class对象中获取构造函数、成员变量、方法等类元素的反射对象,并以编程的方式通过这些反射对象对目标类对象进行操作。这些反射对象类在java.lang.reflect包中。主要的反射类有ConstructorMethodFieldClassLoader等。

 

public class PrivateCar {

    private String color;

    protected void drive(){

        System.out.println("Drive private car! The color is :"+color);

    }

}

 

public class PrivateCarReflect {

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

        //通过类装载器获得PrivateCar类对象

        ClassLoader loader = Thread.currentThread().getContextClassLoader();

        Class clazz = loader.loadClass("com.quietboy.reflect.PrivateCar");

        //得到实例

        PrivateCar pcar = (PrivateCar)clazz.newInstance();

        //访问属性,并设置属性

        Field color = clazz.getDeclaredField("color");

        color.setAccessible(true);//取消Java语言访问检查,以访问private变量

        color.set(pcar, "红色");

        //访问方法,并调用方法

        Method drive = clazz.getDeclaredMethod("drive", null);

        drive.setAccessible(true);//取消Java语言访问检查,以访问protected方法

        drive.invoke(pcar, null);

       

    }

}

 

 

只要JVM的安全机制允许,反射机制可以绕过限制,访问私有变量、调用私有方法。

分享到:
评论
1 楼 zhang_yi_yi 2014-06-26  

相关推荐

    实战Java虚拟机——JVM故障诊断与性能优化 pdf

    《实战Java虚拟机——JVM故障诊断与性能优化》内容简介:随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为一个充满活力的生态圈。本书将通过200余示例详细介绍Java虚拟机中的...

    Java虚拟机类装载的原理及实现

    所有JVM都内置了一个特殊的类装载器——根装载器(Bootstrap ClassLoader),它负责装载Java核心类库。当需要装载非设计时已知的类时,则需要使用用户自定义的类装载器。 #### 实例演示 以下是一个简单的示例,...

    Java的类装载器和命名空间

    - **启动类装载器**:由JVM自身实现,主要负责加载JDK的核心类库,如rt.jar中的java.lang.*等基础类。 - **用户自定义装载器**:继承自`java.lang.ClassLoader`抽象类,可以由开发者创建以加载特定位置或方式获取...

    实战Java虚拟机——JVM故障诊断与性能优化

    第9~10章介绍了Java虚拟机的核心——Class文件结构,以及Java虚拟机中类的装载系统。第11章介绍了Java虚拟机的执行系统和字节码,并给出了通过ASM框架进行字节码注入的案例。, 《实战Java虚拟机——JVM故障诊断与...

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

    ### Java深度历险(2)--深入类装载器 #### 前言 在现代软件开发领域,特别是使用Java这样的高级编程语言时,“动态性”是一个非常重要的概念。它指的是程序能够在运行时根据需要加载、卸载或替换部分代码的能力。这...

    Java虚拟机类装载机制

    Java虚拟机类装载机制是Java运行环境中的核心组成部分,它负责将类的字节码从磁盘、网络等不同来源加载到JVM中,并进行一系列处理以使类能够被正确地使用。类装载机制的目的是为了实现代码的动态加载和运行时的灵活...

    最优装载问题——回溯法

    最优装载问题——回溯法 最优装载问题——回溯法 最优装载问题——回溯法

    java类装载器学习一、类加载器的基本概念

    类装载器学习一、类加载器的基本概念 类装载器学习一、类加载器的基本概念 类装载器学习一、类加载器的基本概念

    JAVA虚拟机的类装载机制的原理分析与应用研究.pdf

    Java虚拟机(JVM)是Java程序运行的核心,它的类装载机制是理解Java应用程序如何启动、运行和管理的关键。本文将深入探讨Java虚拟机的类装载机制,包括其原理、工作流程以及在实际开发中的应用。 类装载机制是Java...

    Java虚拟机类装载:原理、实现与应用

    另一个例子是Java的反射API,它利用类装载机制在运行时动态访问和操作类的属性和方法。 总的来说,理解Java虚拟机的类装载机制对于深入掌握Java应用程序的运行机制至关重要。通过自定义ClassLoader,开发者可以实现...

    java之jvm学习笔记五(实践写自己的类装载器)

    通过实践编写自己的类装载器,不仅可以加深对JVM内部工作原理的理解,还能锻炼对Java反射、字节码操作、类加载机制的掌握。这是一个提升Java技术水平的重要步骤,也是成为一名资深Java开发者必备的技能之一。

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

    本文将详细介绍Java基础中的反射机制,包括Class类、ClassLoader类、Constructor、Method、Field类的用法,以及动态代理机制。 Class类 Class类是Java中一个特殊的类,用于描述类本身的信息。每个类在JVM中都有一...

    Java基础知识点pdf

    - 字节码文件被加载到Java虚拟机中,由**类装载器(ClassLoader)**加载,经过**字节码校验器(Bytecode Verifier)**验证后,由**解释器(Interpreter)**执行。 - 这个过程确保了Java程序的安全性和跨平台性。 ...

    [浅析J2EE应用服务器的JAVA类装载器]python回朔异常的模块.docx

    Java类装载器机制是Java语言灵活性的关键组成部分,尤其在J2EE应用服务器中扮演着重要角色。理解这一机制有助于开发者更好地部署和管理应用程序,解决可能出现的部署问题。 Java类装载器是Java虚拟机(JVM)的一...

    jvm类装载器原理

    《JVM类装载器原理详解》 Java的JVM(Java Virtual Machine)类装载器是...总之,深入理解JVM的类装载器原理,不仅有助于我们更好地理解和调试Java程序,也有助于我们在实际开发中实现更加高效和灵活的类管理机制。

    java类装载

    java类装载介绍,介绍了java装载类的先后顺序

    2021Java大厂面试题——大厂真题之携程-Java高级.pdf

    ### 2021年Java大厂面试题详解——大厂真题之携程-Java高级 ...通过对以上知识点的深入理解,可以帮助Java开发者更好地掌握JVM的类加载机制,从而在实际开发中避免一些常见的问题,并提高系统的稳定性和安全性。

    【JVM】类的奇幻漂流——类加载机制探秘

    【JVM】类的奇幻漂流——类加载机制探秘 Java虚拟机(JVM)是运行Java程序的核心组件,它负责将我们编写的类加载到内存中并执行。类加载机制是JVM的一个重要组成部分,它确保了程序的正常运行。本文将带你深入理解...

    基于Java反射机制的POI实现Excel数据导入_导出.pdf

    通过采用Java反射机制,可以获得类的信息,构建类的Class对象和生成类的实例,并访问装载到JVM中的类的内部信息。 在本文中,我们使用了POI组件来实现Excel文件的操作,并采用Java反射机制来实现数据库与Excel文件...

Global site tag (gtag.js) - Google Analytics