- 浏览: 502702 次
- 性别:
- 来自: 沈阳
文章分类
- 全部博客 (437)
- Windows设置 (2)
- oracle数据库 (39)
- bug--jsp (4)
- j2se (13)
- js (40)
- bug-tomcat不能启动程序 (1)
- Hibernate (29)
- eclipse (20)
- java (65)
- 设计模式 (6)
- bug (18)
- PL/SQL (11)
- 前台 (5)
- 杂谈 (25)
- UML (1)
- jdbc编程 (2)
- 技术调研 (1)
- 数据通信 (2)
- ios (1)
- servlet自学笔记 (10)
- tomcat (9)
- SQL学习笔记 (6)
- java工具 (1)
- 数据库设计 (4)
- javascript (10)
- jsp (11)
- struts (17)
- ajax (7)
- linix/Unix (6)
- 资源 (3)
- spring (14)
- 算法 (5)
- 计算机网络 (2)
- http (5)
- c++ (2)
- web应用 (3)
- jvm (5)
- java中的字符编码 (14)
- java代码库 (2)
- classloader (1)
- 读书笔记 (1)
- c (1)
- 开源软件 (1)
- svn (1)
- AOP (1)
- java序列化 (1)
- 多线程 (4)
- The legendary programmers (1)
- Apache http Server (1)
- html tag (3)
- struts1.X学习笔记 (5)
- buffalo (1)
- 自己收藏 (0)
- TOEFL(IBT) (1)
- 网络翻墙 (0)
- 编译原理 (1)
- 书籍推荐 (1)
- css (10)
- javaee环境搭建资料 (1)
- 开源工具 (1)
- 美国生活 (1)
- spring自学 (3)
- log4j (3)
- 算法与数据结构 (5)
- 病毒,插件处理大全 (1)
- flex (2)
- webservice (1)
- git (7)
- cs (1)
- html (4)
- javaee (6)
- 开车 (0)
- springmvc (3)
- 互联网架构 (2)
- intellij idea (18)
- maven (15)
- mongodb (2)
- nginx (1)
- react (3)
- java基础例子 (2)
- springboot (2)
- 培训 (5)
- mysql (3)
- 数据库 (3)
- 生活 (2)
- intellij (3)
- linux (2)
- os (3)
最新评论
-
潇洒天涯:
[color=blue][color=cyan] ...
oracle 通过 nvl( )函数sql 查询时为 空值 赋默认值 -
hekai1990:
受教了..
oracle中的varchar2
What is ClassLoader? 与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。 Bootstrap ClassLoader (Extension ClassLoader, ApplicationClassLoader) JVM本身包含了一个ClassLoader称为Bootstrap ClassLoader,和JVM一样,BootstrapClassLoader是用本地代码(是用C++编写的)实现的,它负责加载核心JavaClass(即所有java.*开头的类)。,我们在Java中看不到它,是null,是JVM自带的类装载器,用来装载核心类库,如java.lang.*等 另外JVM还会提供两个ClassLoader,它们都是用Java语言编写的,由BootstrapClassLoader加载;其中Extension ClassLoader负责加载扩展的Javaclass(例如所有javax.*开头的类和存放在JRE的ext目录下的类),ApplicationClassLoader负责加载应用程序自身的类。 当运行一个程序的时候,JVM启动,运行bootstrapclassloader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程。 (1)首先加载核心API,让系统最基本的运行起来 (2)加载扩展类 (3)加载用户自定义的类 publicstatic void main(String[] args) { System.out.println(System.getProperty("sun.boot.class.path")); System.out.println(System.getProperty("java.ext.dirs")); System.out.println(System.getProperty("java.class.path")); } 程序结果为: E:\Myeclipse6.0\jre\lib\rt.jar;E:\Myeclipse 6.0\jre\lib\i18n.jar;E:\Myeclipse6.0\jre\lib\sunrsasign.jar;E:\MyEclipse6.0\jre\lib\JSse.jar;E:\MyEclipse 6.0\jre\lib\jce.jar;E:\MyEclipse6.0\jre\lib\charsets.jar;E:\MyEclipse 6.0\jre\classes E:\MyEclipse6.0\jre\lib\ext E:\workspace\ClassLoaderDemo\bin 在上面的结果中,你可以清晰看见三个ClassLoader分别加载类的路径;也知道为什么我们在编写程序的时候,要把用到的jar包放在工程的classpath下面啦,也知道我们为什么可以不加载java.lang.*包啦!其中java.lang.*就在rt.jar包中; When to load the class? 什么时候JVM会使用ClassLoader加载一个类呢?当你使用java去执行一个类,JVM使用ApplicationClassLoader加载这个类;然后如果类A引用了类B,不管是直接引用还是用Class.forName()引用,JVM就会找到加载类A的ClassLoader,并用这个ClassLoader来加载类B。JVM按照运行时的有效执行语句,来决定是否需要装载新类,从而装载尽可能少的类,这一点和编译类是不相同的。 ClassLoader的加载机制: "双亲委托" 加载模式 自定义一个URL类: packagejava.net; publicclass URL { privateString path; publicURL(String path) { this.path= path; } publicString toString() { returnthis.path + " new Path"; } } 在这种情况下,系统会提示我们出现异常,因为我们有两个相同的类,一个是真正的URL,一个是我在上面实现的伪类;出现异常是正常的,因为你想想,如果我们在执行一个applet的时候,程序自己实现了一个String的类覆盖了我们虚拟机上面的真正的String类,那么在这个String里面,不怀好意的人可以任意的实现一些功能;这就造成极不安全的隐患;所以java采用了一种名为“双亲委托”的加载模式; packagejava.net; importjava.net.*; publicclass TheSameClsDemo { publicstatic void main(String[] args) { URLurl = new URL("http://www.baidu.com"); System.out.println(url.toString()); } } 以下是jdk源代码: protectedsynchronized Class<?> loadClass(String name, boolean resolve) throwsClassNotFoundException { //First, check if the class has already been loaded Classc = findLoadedClass(name); if(c == null) { try{ if(parent != null) { c= parent.loadClass(name, false); }else { c= findBootstrapClass0(name); } }catch (ClassNotFoundException e) { //If still not found, then invoke findClass in order to find theclass. c= findClass(name); } } if(resolve) { resolveClass(c); } returnc; } 在上面的代码中,我们可以清晰的看见,我们调用一个ClassLoader加载程序的时候,这个ClassLoader会先调用设置好的parentClassLoader来加载这个类,如果parent是null的话,则默认为BootClassLoader类,只有在parent没有找的情况下,自己才会加载,这就避免我们重写一些系统类,来破坏系统的安全; 类与它所依赖的类的classloader机制: 如果一个类是由某个classloader加载,那么这个类依赖的类(非显式的通过某个classloader加载)必须也由该classloader或其父classloader加载,无视子classloader Unloading? 当一个javaclass被加载到JVM之后,它有没有可能被卸载呢?我们知道Win32有FreeLibrary()函数,Posix有dlclose()函数可以被调用来卸载指定的动态连接库,但是Java并没有提供一个UnloadClass()的方法来卸载指定的类。 在Java中,java class的卸载仅仅是一种对系统的优化,有助于减少应用对内存的占用。既然是一种优化方法,那么就完全是JVM自行决定如何实现,对Java开发人员来说是完全透明的。 在什么时候一个java class/interface会被卸载呢?Sun公司的原话是这么说的:"class or interfacemay be unloaded if and only if its class loader is unreachable. Classesloaded by the bootstrap loader may not be unloaded." Reloading? 事实上我们关心的不是如何卸载类的,我们关心的是如何更新已经被加载了的类从而更新应用的功能。JSP则是一个非常典型的例子,如果一个JSP文件被更改了,应用服务器则需要把更改后的JSP重新编译,然后加载新生成的类来响应后继的请求。 其实一个已经加载的类是无法被更新的,如果你试图用同一个ClassLoader再次加载同一个类,就会得到异常(java.lang.LinkageError: duplicate classdefinition),我们只能够重新创建一个新的ClassLoader实例来再次加载新类。至于原来已经加载的类,开发人员不必去管它,因为它可能还有实例正在被使用,只要相关的实例都被内存回收了,那么JVM就会在适当的时候把不会再使用的类卸载。 使用线程上下文类加载器, 可以在执行线程中, 抛弃双亲委派加载链模式, 使用线程上下文里的类加载器加载类. 典型的例子有, 通过线程上下文来加载第三方库jndi实现, 而不依赖于双亲委派. 大部分java app服务器(jboss, tomcat..)也是采用contextClassLoader来处理web服务。 当然, 好东西都有利弊. 使用线程上下文加载类, 也要注意, 保证多根需要通信的线程间的类加载器应该是同一个, 防止因为不同的类加载器, 导致类型转换异常(ClassCastException).
发表评论
-
【转】Spring的DAO异常-你可能忽视的异常
2018-10-11 05:04 539Spring的DAO框架没有抛出与特定技术相关的异常,例如 ... -
【转】java8 Optional
2018-10-05 02:39 467https://my.oschina.net/wangz ... -
java double checked locking broken
2018-09-15 01:56 486// Double-check idiom for lazy ... -
【转】JAVA泛型通配符(PECS)
2018-07-29 10:43 513在JAVA的泛型集合中,默认都可以添加null,除此以外, ... -
Differences between notify() and notifyAll()
2018-07-16 09:01 521Notification to number of th ... -
【转】深度解析Java多线程的内存模型
2018-07-16 09:00 486https://www.jianshu.com/p/a3f ... -
maven项目src源代码下的资源文件不自动复制到classes文件夹的解决方法
2018-07-01 23:34 1187POM文件 <build><resour ... -
java好用的开源库
2018-04-28 23:40 0guava--google第三方数据结构开源包 Vardu ... -
【转】java rmi
2018-01-03 18:57 397此处讲的是Java中的RMI ... -
【转】字符编码笔记:ASCII,Unicode 和 UTF-8
2017-12-12 19:09 449今天中午,我突然想搞清楚 Unicode 和 UTF-8 之 ... -
【转】Java web 学习路线
2017-06-14 15:55 700JSP -> Servlet -> Java ... -
有意思的ASCII程序注释
2017-06-14 10:39 732/** * * create ... -
【转】Java基础知识总结(绝对经典)
2017-06-13 14:13 517本人学习java时,做的java基础知识总结: 因内容较 ... -
java定时任务
2017-03-27 10:08 409import java.util.concurrent.Ex ... -
二分查找(java实现)
2017-03-21 11:02 484二分查找 算法思想:又叫折半查找,要求待查找的序列有序。每 ... -
java环境配置
2017-03-15 15:46 437增加系统变量: JAVA_HOME C:\Program ... -
Java中的Big(Little)-endian问题的一种解决方法
2017-03-08 15:47 1030http://blog.sina.com.cn/s/blo ... -
【转】Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
2016-12-13 15:07 703http://www.cnblogs.com/hoojo ... -
【转】JNDI学习总结(三)——Tomcat下使用Druid配置JNDI数据源
2016-12-13 14:50 1274http://www.cuomi.com/html/co ... -
【转】JNDI学习总结(二)——Tomcat下使用C3P0配置JNDI数据源
2016-12-13 14:48 724http://blog.csdn.net/samjustin ...
相关推荐
System.out.println("parent class loader: " + cl.getParent()); cl = cl.getParent(); } ``` 这段代码会打印出当前的类加载器以及它们的父加载器。通常,你会看到AppClassLoader(系统类加载器)、...
在Java编程语言中,类加载器(Class-Loader)是一个至关重要的组件,它负责加载类到JVM(Java虚拟机)中。这个“class-loader测试工程”可能是一个专门设计用于研究和理解Java类加载机制的项目。在Java中,类加载...
### 深入理解Java的Class Loader:动态性与灵活性的核心 #### 一、Class Loader在Java中的核心地位 在Java编程的世界里,类加载器(Class Loader)扮演着极其关键的角色,它不仅支撑起了Java的动态性,还极大地...
创建自定义类加载器通常需要继承`java.lang.ClassLoader`,重写`findClass()`或`loadClass()`方法,从而控制类的查找和加载过程。这使得开发者能够在运行时根据需要加载特定的类,比如从网络、数据库或其他非传统...
class_loader_utility.cc
1. **类加载器层次结构** Java中的类加载器分为三个主要层次:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和系统类加载器(AppClassLoader)。启动类加载器负责加载JRE核心库,...
1. **懒加载**:类只有在被真正需要时才会被加载到内存中。这种策略可以减少不必要的内存占用,并加快系统响应速度。 - **优势**:延迟加载可以显著提高应用程序启动时的速度,因为它避免了一次性加载所有类所...
应用服务器类加载器 共享库 类加载器问题诊断 资源及参考资料
最后,我们可以参考博客文章《Ejb class loader》(链接:https://sbiigu.iteye.com/blog/323180)来获取更具体的实现细节和技术讨论。该博客可能包含了作者在实际工作中遇到的问题、解决方案以及对EJB类加载器的...
1. **单参数版本**:`Class.forName(String className)` - 这个方法使用当前线程的上下文类加载器(如果没有设置,则使用系统的应用类加载器)来加载类,并且会初始化该类。 - 代码示例: ```java try { Class...
在C++编程中,动态类加载(Dynamic Class Loading)是一种高级技术,允许程序在运行时加载未知或在编译时不可用的类。这通常用于实现插件系统、模块化设计或者灵活的软件架构。开源的C++动态类加载机制为开发者提供...
本工具是对java class文件进行加密保护防止反编译的工具!本工具全面支持linux/unix/windows操作系统。 继推出v1.0版本后,获得了用户大量的支持与的反馈,我们再次推出本v2.0版,对加密算法进行了更大的改进,安全...
1.在现有SLLoader.xap项目中使用SilverlightLoader:先下载SilverlightLoader压缩包,从下载的Release中找到SilverlightLoader.cs,并将其添加到SLLoader.xap项目中,具体实现方法:在SLLoader.xap项目中右键添加已...
1. **加载(Loading)**:这是类加载的第一步,由类加载器完成。加载器根据类名查找对应的.class文件,这个过程可以通过系统类加载器或者自定义的类加载器来实现。一旦找到,字节码会被读取并转化为Class对象。 2. ...
public class Application1 { public static void main(String[] args) { try { String sqlLoaderCmd = "sqlldr username/password@database control=control_file.ctl log=log_file.log"; Process process = ...
1. **创建Loader子类**:你需要继承`android.content.Loader`并实现其抽象方法。例如,可以创建一个名为`CustomImageLoader`的类,继承自`Loader<List<Bitmap>>`。 2. **重写onCreateLoader()**:在这个方法中,...
column1, column2, ... ) ``` 在这个例子中,`N.txt` 是数据文件,每行数据由逗号分隔,字段可以被双引号包围,允许有空值。 接下来,让我们看看如何在 C# 中调用 Sql Loader。`System.Diagnostics.Process` 类...
加密算法达到256位,加密后的class文件不可能被破解,反编译工具也对加密后的class文件无能为力。 运行方式: 运行时,要能正确的加载加密后的class文件, 必须使用我们提供的动态链接库classloader.dll(wndows...
1. **矢量图形支持**:SVG图标可以无损缩放,无论在何种分辨率的设备上都能保持清晰。 2. **文件大小优化**:相比于独立的SVG或图片文件,图标字体可以将所有图标打包成一个字体文件,减少HTTP请求,从而提升页面...
在上述的Demo1示例中,`easyloader.js`的引入使得页面中的class以"easyui"开头的元素被转化为EasyUI的相应控件。 EasyUI Loader的工作流程大致如下: 1. **初始化**:当`easyloader.js`被引入后,Loader开始初始化...