`

java程序类加载完全解密(未完)

    博客分类:
  • java
阅读更多

Java程序类加载完全揭密

2005-10-19 15:34作者:purplerain编译出处:matrix责任编辑:方舟
<!---->
<!---->
  版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明

  类加载是java语言提供的最强大的机制之一。尽管类加载并不是讨论的热点话题,但所有的编程人员都应该了解其工作机制,明白如何做才能让其满足我们的需要。这能有效节省我们的编码时间,从不断调试ClassNotFoundException, ClassCastException的工作中解脱出来。

  这篇文章从基础讲起,比如代码与数据的不同之处是什么,他们是如何构成一个实例或对象的。然后深入探讨java虚拟机(JVM)是如何利用类加载器读取代码,以及java中类加载器的主要类型。接着用一个类加载的基本算法看一下类加载器如何加载一个内部类。本文的下一节演示一段代码来说明扩展和开发属于自己的类加载器的必要性。紧接着解释如何使用定制的类加载器来完成一个一般意义上的任务,使其可以加载任意远端客户的代码,在JVM中定义,实例化并执行它。本文包括了J2EE关于类加载的规范——事实上这已经成为了J2EE的标准之一。

  类与数据

  一个类代表要执行的代码,而数据则表示其相关状态。状态时常改变,而代码则不会。当我们将一个特定的状态与一个类相对应起来,也就意味着将一个类事例化。尽管相同的类对应的实例其状态千差万别,但其本质都对应着同一段代码。在JAVA中,一个类通常有着一个.class文件,但也有例外。在JAVA的运行时环境中(Java runtime),每一个类都有一个以第一类(first-class)的Java对象所表现出现的代码,其是java.lang.Class的实例。我们编译一个JAVA文件,编译器都会嵌入一个public, static, final修饰的类型为java.lang.Class,名称为class的域变量在其字节码文件中。因为使用了public修饰,我们可以采用如下的形式对其访问:

java.lang.Class klass = Myclass.class;

  一旦一个类被载入JVM中,同一个类就不会被再次载入了(切记,同一个类)。这里存在一个问题就是什么是“同一个类”?正如一个对象有一个具体的状态,即标识,一个对象始终和其代码(类)相关联。同理,载入JVM的类也有一个具体的标识,我们接下来看。

  在Java中,一个类用其完全匹配类名(fully qualified class name)作为标识,这里指的完全匹配类名包括包名和类名。但在JVM中一个类用其全名和一个加载类ClassLoader的实例作为唯一标识。因此,如果一个名为Pg的包中,有一个名为Cl的类,被类加载器KlassLoader的一个实例kl1加载,Cl的实例,即C1.class在JVM中表示为(Cl, Pg, kl1)。这意味着两个类加载器的实例(Cl, Pg, kl1) 和 (Cl, Pg, kl2)是不同的,被它们所加载的类也因此完全不同,互不兼容的。那么在JVM中到底有多少种类加载器的实例?下一节我们揭示答案。

  类加载器

  在JVM中,每一个类都被java.lang.ClassLoader的一些实例来加载.类ClassLoader是在包中java.lang里,开发者可以自由地继承它并添加自己的功能来加载类。

  无论何时我们键入java MyMainClass来开始运行一个新的JVM,“引导类加载器(bootstrap class loader)”负责将一些关键的Java类,如java.lang.Object和其他一些运行时代码先加载进内存中。运行时的类在JRE\lib\rt.jar包文件中。因为这属于系统底层执行动作,我们无法在JAVA文档中找到引导类加载器的工作细节。基于同样的原因,引导类加载器的行为在各JVM之间也是大相径庭。
同理,如果我们按照如下方式:

log(java.lang.String.class.getClassLoader());

  来获取java的核心运行时类的加载器,就会得到null。

  接下来介绍java的扩展类加载器。扩展库提供比java运行代码更多的特性,我们可以把扩展库保存在由java.ext.dirs属性提供的路径中。

  (编辑注:java.ext.dirs属性指的是系统属性下的一个key,所有的系统属性可以通过System.getProperties()方法获得。在编者的系统中,java.ext.dirs的value是” C:\Program Files\Java\jdk1.5.0_04\jre\lib\ext”。下面将要谈到的如java.class.path也同属系统属性的一个key。)

  类ExtClassLoader专门用来加载所有java.ext.dirs下的.jar文件。开发者可以通过把自己的.jar文件或库文件加入到扩展目录的classpath,使其可以被扩展类加载器读取。

  从开发者的角度,第三种同样也是最重要的一种类加载器是AppClassLoader。这种类加载器用来读取所有的对应在java.class.path系统属性的路径下的类。

  Sun的java指南中,文章“理解扩展类加载”(Understanding Extension Class Loading)对以上三个类加载器路径有更详尽的解释,这是其他几个JDK中的类加载器

  ●java.net.URLClassLoader

  ●java.security.SecureClassLoader

  ●java.rmi.server.RMIClassLoader

  ●sun.applet.AppletClassLoader

  java.lang.Thread,包含了public ClassLoader getContextClassLoader()方法,这一方法返回针对一具体线程的上下文环境类加载器。此类加载器由线程的创建者提供,以供此线程中运行的代码在需要加载类或资源时使用。如果此加载器未被建立,缺省是其父线程的上下文类加载器。原始的类加载器一般由读取应用程序的类加载器建立。
分享到:
评论

相关推荐

    Java动态类加载机制分析及其应用.pdf

    Java 类加载器是一个层次结构,包括启动类加载器、扩展类加载器和应用程序类加载器。每个类加载器都负责加载特定的类文件。Java 动态类加载机制通过委托模型来实现,委托模型是一种设计模式,用于实现类加载器之间的...

    Java解密微信小程序手机号的方法

    Java解密微信小程序手机号的方法 ...Java解密微信小程序手机号的方法主要通过创建AES解密工具类来实现,使用AES-128-CBC算法对微信数据进行解密。该方法具有较高的安全性和效率,可以满足实际应用中的需求。

    java 类加载器 加密

    总结起来,Java 类加载器加密是一种增强程序安全性的技术,通过自定义类加载器和解密逻辑,可以在加载类之前对其进行加密,提高代码的保护性。同时,结合反射机制,即使类是加密状态,也能正常执行程序。这种技术常...

    java解密 java解密

    java解密 java解密java解密java解密java解密java解密java解密java解密java解密java解密java解密java解密java解密java解密java解密java解密java解密java解密java解密java解密java解密java解密java解密java解密java...

    java微信小程序加密数据解密

    在Java中实现微信小程序的加密数据解密是一个关键的技术环节,尤其对于那些涉及到用户隐私或者敏感信息的应用。微信小程序为了保证数据的安全传输,采用了特定的加密机制,这要求开发者在后端服务器上进行相应的解密...

    小程序+java后端统一 des 加密解密

    在标题提到的"小程序+java后端统一 des 加密解密"中,我们主要讨论的是使用DES(Data Encryption Standard)算法进行数据加密和解密的实践,这涉及到小程序客户端与Java后端服务之间的安全通信。 DES是一种对称加密...

    Java动态类加载机制应用研究.pdf

    3. AppClassLoader(应用程序类加载器):也称为SystemClassLoader(系统类加载器),是用于加载类路径(Classpath)上的类。开发者可以自定义类路径,AppClassLoader将根据类路径去加载类文件。它对于加载应用程序...

    Java实现的RSA加密解密算法示例

    在Java中,可以使用Cipher类来实现RSA加密和解密。Cipher类提供了加密和解密的方法,例如doFinal()方法和update()方法。例如,在上面的代码中,我们使用Cipher类来实现加密和解密。 知识点6:密钥文件的生成 在RSA...

    Java Base64加密解密方法工具类

    Java Base64加密解密方法工具类

    Java调用dll实现des加密解密

    在IT行业中,有时我们需要在Java程序中使用非Java编写的库,例如DLL(动态链接库)文件,这在Windows环境中非常常见。本话题主要聚焦于如何在Java中调用DLL来实现DES(Data Encryption Standard)加密和解密操作。...

    java实现的加解密程序,适合新手

    java用异或实现的加解密程序,适合新手,并且做了简单的图形化界面,点击第一个按钮选择文件,在第二个文本框里输入密码,最后点击开始加密

    java_RSA2048加密解密.zip

    Java代码可能使用了`java.security`包下的`KeyPairGenerator`、`PublicKey`、`PrivateKey`等类来生成和管理密钥对,以及`Cipher`类来进行加密和解密操作。后端接收到前端加密的数据后,使用私钥进行解密,确保数据在...

    Java实现微信小程序加密数据解密算法

    在Java编程环境中,微信小程序使用的加密数据解密算法主要涉及到的是微信官方提供的接口与协议,用于保护用户数据的安全性。这个过程通常包括了对微信小程序API返回的加密数据进行解密,以便在后端服务器中处理。...

    Java加壳源码-自定义类加载器

    默认的类加载器包括Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和AppClassLoade(应用程序类加载器),它们按照双亲委派模型工作。 自定义类加载器的创建通常涉及以下步骤: 1...

    java实现文件加密解密

    "java实现文件加密解密" Java 实现文件的加密与解密是指利用 Java 语言将资源文件(包括图片、动画等类型)进行简单的加密和解密。这种策略的原因和好处是将准备好的资源存储在云上,使用时通过网络进行读取即可,...

    java加密解密程序

    Java加密解密程序是软件开发中的一个重要领域,主要用于保护数据的安全性和隐私性。在这个特定的案例中,我们讨论的是一个基于MyEclipse开发的Java应用程序,它实现了凯撒加密法,这是一种古老但基础的加密技术。...

    Java加密解密小程序

    ### Java加密解密小程序知识点详解 #### 一、程序概述 本程序是一个基于Java Swing的图形用户界面(GUI)加密解密工具。它允许用户在窗口中输入明文信息,并通过点击“加密”按钮实现对信息的加密处理;加密后的...

    java实现md5 加密解密

    java实现md5 加密解密(在网络中MD5是著名的不可逆算法,但是如果知道MD5的加密的字符串 则可以通过自己的加密算法对明文进行加密,对加密后的密文与字符串匹配; 匹配成功,表示找到明文;但是此程序的时间耗费较高!仅...

    java CRC32Util 加密解密工具类

    java CRC32Util 加密解密工具类

Global site tag (gtag.js) - Google Analytics