Tomcat源码学习——第2章
2015-06-30 19:14
429 查看
1.运行时加载URLClassLoader
Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:
引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。
扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()
来获取它。
除了系统提供的类加载器以外,开发人员可以通过继承 java.lang.ClassLoader 类的方式实现自己的类加载器,以满足一些特殊的需求。
我们平时程序执行的时候在类加载器中寻找类的结构的顺序是:引导类加载器-》 扩展类加载器-》系统类加载器-》我们自定义的一些类加载器,每个类加载器都有自己的空间,同一个加载器里面的类的二进制名字必须是唯一的,当然同一个类也可以存在不同的加载器内存区域里面,不过我们寻找类的时候是按顺序找的,一但找的也就不会继续往下找了,最终也没找到就会报类不存在异常。
我们如果想动态加载类的话就要仿照我们用的服务器如tomcat和weblogic之类的,他们的开发模式也就是把所有的类都加载到自身的类加载器中,当文件被替换的时候他们就重新加载新的class到内存里面去,从而实现了类的动态加载。
2、使用概要:
File file = new File(jar文件全路径);
URL url = file.toURI().toURL();
URLClassLoader loader = new URLClassLoader(new URL[] { url });
Class tidyClazz = loader.loadClass(所需class的含包名的全名);
详细说明:
我们知道,Java利用ClassLoader将类载入内存,并且在同一应用中,可以有很多个ClassLoader,通过委派机制,把装载的任务传递给上级的装载器的,依次类推,直到启动类装载器(没有上级类装载器)。如果启动类装载器能够装载这个类,那么它会首先装载。如果不能,则往下传递。当父类为null时,JVM内置的类(称为:bootstrap class loader)就会充当父类。想想眼下的越来越多用XML文件做配置文件或者是描述符、部署符。其实这些通过XML文档描述的配置信息最终都要变成Java类,其实都是通过ClassLoader来完成的。URLClassLoader是ClassLoader的子类,它用于从指向
JAR 文件和目录的 URL 的搜索路径加载类和资源。也就是说,通过URLClassLoader就可以加载指定jar中的class到内存中。
下面来看一个例子,在该例子中,我们要完成的工作是利用URLClassLoader加载jar并运行其中的类的某个方法。
首先我们定义一个接口,使所有继承它的类都必须实现action方法,如下:
package uRLClassLoaderTest;
public interface ActionInterface {
public String action();
}
完成后生成class文件,再将其打包为testInterface.jar文件。
接下来新建一工程,为了编译通过,引入之前打好的testInterface.jar包。并创建TestAction类,使它实现ActionInterface接口。如下:
package uRLClassLoaderTest;
import uRLClassLoaderTest.ActionInterface;
public class TestAction implements ActionInterface{
public String action()
{
return "this ActionTest class";
}
}
同样,完成后生成class文件,再将其打包为test.jar,放在c盘根目录下。下面要做的就是利用URLClassLoader加载并运行TestAction的action方法,并将返回的值打印在控制台上。
新建一工程,引入testInterface.jar包。并创建一可执行类(main方法),在其中加入如下代码:
2、门面模式Facade(结构型)
32种设计模式,如不熟练请翻阅gang of four 的 《设计模式》
Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:
引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。
扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()
来获取它。
除了系统提供的类加载器以外,开发人员可以通过继承 java.lang.ClassLoader 类的方式实现自己的类加载器,以满足一些特殊的需求。
我们平时程序执行的时候在类加载器中寻找类的结构的顺序是:引导类加载器-》 扩展类加载器-》系统类加载器-》我们自定义的一些类加载器,每个类加载器都有自己的空间,同一个加载器里面的类的二进制名字必须是唯一的,当然同一个类也可以存在不同的加载器内存区域里面,不过我们寻找类的时候是按顺序找的,一但找的也就不会继续往下找了,最终也没找到就会报类不存在异常。
我们如果想动态加载类的话就要仿照我们用的服务器如tomcat和weblogic之类的,他们的开发模式也就是把所有的类都加载到自身的类加载器中,当文件被替换的时候他们就重新加载新的class到内存里面去,从而实现了类的动态加载。
2、使用概要:
File file = new File(jar文件全路径);
URL url = file.toURI().toURL();
URLClassLoader loader = new URLClassLoader(new URL[] { url });
Class tidyClazz = loader.loadClass(所需class的含包名的全名);
详细说明:
我们知道,Java利用ClassLoader将类载入内存,并且在同一应用中,可以有很多个ClassLoader,通过委派机制,把装载的任务传递给上级的装载器的,依次类推,直到启动类装载器(没有上级类装载器)。如果启动类装载器能够装载这个类,那么它会首先装载。如果不能,则往下传递。当父类为null时,JVM内置的类(称为:bootstrap class loader)就会充当父类。想想眼下的越来越多用XML文件做配置文件或者是描述符、部署符。其实这些通过XML文档描述的配置信息最终都要变成Java类,其实都是通过ClassLoader来完成的。URLClassLoader是ClassLoader的子类,它用于从指向
JAR 文件和目录的 URL 的搜索路径加载类和资源。也就是说,通过URLClassLoader就可以加载指定jar中的class到内存中。
下面来看一个例子,在该例子中,我们要完成的工作是利用URLClassLoader加载jar并运行其中的类的某个方法。
首先我们定义一个接口,使所有继承它的类都必须实现action方法,如下:
package uRLClassLoaderTest;
public interface ActionInterface {
public String action();
}
完成后生成class文件,再将其打包为testInterface.jar文件。
接下来新建一工程,为了编译通过,引入之前打好的testInterface.jar包。并创建TestAction类,使它实现ActionInterface接口。如下:
package uRLClassLoaderTest;
import uRLClassLoaderTest.ActionInterface;
public class TestAction implements ActionInterface{
public String action()
{
return "this ActionTest class";
}
}
同样,完成后生成class文件,再将其打包为test.jar,放在c盘根目录下。下面要做的就是利用URLClassLoader加载并运行TestAction的action方法,并将返回的值打印在控制台上。
新建一工程,引入testInterface.jar包。并创建一可执行类(main方法),在其中加入如下代码:
package test; import java.net.*; import java.io.*; import actionInterface.ActionInterface; public class ClassLoaderTest { public static void main(String args[]) { try { File file=new File("rtest.txt"); BufferedReader in=new BufferedReader(new FileReader(file)); String s=new String(); while((s=in.readLine())!=null) { URL url=new URL(s); s=null; URL url1=new URL("file:c:/test1.jar"); URLClassLoader myClassLoader=new URLClassLoader(new URL[]{url},Thread.currentThread().getContextClassLoader()); Class myClass=myClassLoader.loadClass("actionImplement.TestAction"); ActionInterface action=(ActionInterface)myClass.newInstance(); String str=action.action(); System.out.println(str); URLClassLoader myClassLoader1=new URLClassLoader(new URL[]{url1},Thread.currentThread().getContextClassLoader()); Class myClass1=myClassLoader1.loadClass("actionImplement.TestAction"); ActionInterface action1=(ActionInterface)myClass1.newInstance(); String str1=action1.action(); System.out.println(str1); } } catch(Exception e) { e.printStackTrace(); } } }
2、门面模式Facade(结构型)
32种设计模式,如不熟练请翻阅gang of four 的 《设计模式》
相关文章推荐
- tomcat连接mysql的3个问题解决
- Tomcat服务器的简单安装和配置
- Eclipse中的项目,在Eclipse上发布到Tomcat,编译过的文件默认存储的位置
- liunx tomcat 重启
- Ubuntu 14.4 下安装 Tomcat + Solr5.2
- Tomcat中的webapps中的web应用的文件结构
- tomcat server.xml 不支持中文注释如何解决
- Web开发中运行环境的配置:(Tomcat7.0.59)和开发环境的配置
- 如何处理Tomcat日志catalina.out日志文件过大的问题
- Tomcat源码学习——第1章
- apache 与 tomcat的关系
- 数据库连接池和Tomcat连接池的配置问题
- tomcat 配置server.xml 指定端口就可以直接打开项目。
- 关于在Eclipse中启动Tomcat报java.lang.OutOfMemoryError: PermGen space的解决方法
- informatica 修改tomcat 连接池
- Tomcat启动后快逸报表报错的解决方法
- tomcat,mysql,linux服务器性能调优
- Tomcat中配置JNDI数据源
- Tomcat中配置JNDI数据源
- linux设置tomcat开机自动启动