`
liushilang
  • 浏览: 89355 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

如何用URLClassLoader来加载一个指定目录下的class类

阅读更多

直接插入我的代码:

public class ServletProcessor1 {

	public void process(Request request, Response response) {
		// TODO Auto-generated method stub
		String uri = request.getUri();
		System.out.println(uri);
		String servletName = uri.substring(uri.lastIndexOf("/")+1);
		URLClassLoader loader = null;
		try{
			URL[] urls = new URL[1];
			URLStreamHandler streamHandler = null;
			File classPath = new File(Constants.WEB_ROOT);
			
			String repository = (new URL("file",null,classPath.getCanonicalPath()+File.separator)).toString();
			urls[0] = new URL(null,repository,streamHandler);
			loader = new URLClassLoader(urls);
		}catch(IOException e){
			e.printStackTrace();
		}
		Class myClass = null;
		try{
			myClass = loader.loadClass(servletName);
		}catch(ClassNotFoundException e){
			System.out.println(e.toString());
		}
		Servlet servlet = null;
		try{
			servlet = (Servlet)myClass.newInstance();
			servlet.service((ServletRequest)request, (ServletResponse)response);
		}catch(Exception e){
			System.out.println(e.toString());			
		}
	}
}

 运行时,总发现 myClass = loader.loadClass(servletName); 报错,

"servletName" 是有WebRoot/WEb-INF/CLASS文件下是有的,

不过在com/servlet_/test/包下面.

 

请高手赐教,急呀!

分享到:
评论
1 楼 woshixushigang 2011-08-15  
loader.loadClass(servletName);  
这个servletName 应该是包名形式的。
Java是利用ClassLoader来加载类到内存的,ClassLoader本身是用java语言写的,所以我们可以扩展自己的 ClassLoader。利用URLClassLoader可以加载指定jar包中的类到内存。在命行上利用URLClassLoader加载jar时,是使用系统类加载器来加载class的,所以在web环境下,就会出错。这是因为JVM中一个类用其全名和一个加载类ClassLoader的实例作为唯一标识的。我们只要利用URLClassLoader的传入当前线程类加载器即可解决。
形如:URLClassLoader myClassLoader  =   new  URLClassLoader( new  URL[]   { url } , Thread.currentThread().getContextClassLoader());

相关推荐

    Java URLClassLoader动态加载jar包1

    需要注意的是,`URLClassLoader`默认只加载指定的URLs,如果需要加载父类加载器的类,可以使用`ClassLoader.getSystemClassLoader()`或者`Thread.currentThread().getContextClassLoader()`。此外,为了安全考虑,...

    使用URLClassLoader加载本地文件夹c盘下的test.jar文件

    `loadClass`方法用于加载指定全限定名的类。一旦类被加载,我们就可以根据需要实例化它,调用其方法。 需要注意的是,运行这段代码时,你需要确保C盘下存在test.jar文件,并且这个JAR文件中包含你想要加载的类。...

    URLClassLoader中指定目录和jar的问题

    - JAR文件内部的类加载同样遵循包结构,`URLClassLoader`会解析JAR的`META-INF/MANIFEST.MF`文件,如果存在`Class-Path`属性,还会加载指定的其他JAR。 5. **动态添加URL**: - 由于`URLClassLoader`的`addURL`...

    URLClassLoader初体验

    `URLClassLoader`还提供了`loadClass()`方法,这个方法是`ClassLoader`的抽象方法实现,用于根据类名加载指定的类。当你调用`loadClass()`时,它会遍历提供的URLs,查找对应的.class文件,并将其转换为Class对象。 ...

    jvm 加载class文件

    此示例展示了如何使用`java.net.URLClassLoader`自定义类加载器来加载特定路径下的`TestClassA`类,并调用其中的方法。 #### 六、总结 通过对Java中JVM加载`.class`文件的过程及其类加载器的具体工作原理的介绍,...

    java反序列化漏洞URLClassLoader利用1

    `URLClassLoader`是Java中的一个类加载器,它可以从指定的URL列表中加载类。在描述中提到的执行链,实际上是一个精心构造的Java反射调用序列,用于创建`URLClassLoader`实例,然后通过这个类加载器加载并执行自定义...

    Java 自动加载JAR文件并运行其中的类方法

    例如,使用服务发现框架(如OSGi)来管理类加载和依赖,或者使用更高级的插件系统(如Spring Boot的起步依赖)来实现更加复杂的插件架构。 总之,Java自动加载JAR文件并运行其中的类方法是一项实用的技术,它增强了...

    Java类加载原理解析文档

    1. 启动(Bootstrap)类加载器:这是最基础的类加载器,由本地代码实现,负责加载`<Java_Runtime_Home>/lib`目录下的核心类库。由于涉及虚拟机内部实现,开发者无法直接访问。 2. 扩展(Extension)类加载器:由`...

    JAVA 类加载机制分析

    自定义类加载器(Custom ClassLoader)允许开发人员扩展加载类的行为,例如使用`URLClassLoader`从指定的URL加载类。类加载的层次结构(hierarchy)从引导类加载器开始,然后是扩展类加载器(ExtClassLoader),最后...

    动态加载类机制JAVA

    - `Class.forName(String className)` 是动态加载类的常见方式,它会尝试加载指定名称的类,并返回`Class`对象。如果类尚未加载到JVM中,该方法会调用相应的类加载器进行加载。 4. URLClassLoader: - 当类位于非...

    Spring bean 动态注册,jar包热替换

    Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class...测试示例中是spring boot 的部分代码,动态加载的内容为接口实现类,且初始化时加载本地的实现类,动态加载后改为非程序加载目录中的jar实现类。

    动态编译、加载java类

    3. **URLClassLoader**: 这是Java标准库中的一个类加载器,它可以从指定的URL加载类。通过创建`URLClassLoader`实例并传入包含源码或编译后类的目录或JAR文件的URL,可以在运行时加载新编译的类。 4. **反射...

    Java类加载器(ClassLoader)1

    - 负责加载Java核心库,如rt.jar、resources.jar以及sun.boot.class.path路径下的类。 - 不继承自java.lang.ClassLoader,没有父加载器。 - 它仅加载以java、javax、sun等开头的基础包类。 2. 扩展类加载器...

    Java虚拟机JVM类加载初始化

    - 网络加载:使用`java.net.URLClassLoader`从网络指定的URL加载类。 - 压缩文件加载:从`.jar`、`.zip`等压缩文件中查找并加载类,自动解析`.jar`文件中的`.class`文件。 - 动态编译:从`.java`源代码文件编译成...

    JAVA文件中调用已编译的.CLASS的类.doc

    - 使用`findClass()`方法加载指定的类,并通过`newInstance()`方法创建实例。 4. **动态加载和执行类**: - 在`MyClassLoader`中,`test()`方法演示了如何加载和执行外部类的方法。它接受类路径字符串和类名,...

    ClassLoaderTest:测试如何正确关闭类加载器,以便可以关闭基础jar文件上的文件句柄

    在`ClassLoaderTest`中,我们可能创建了一个自定义的URLClassLoader,用于加载指定路径下的类或jar文件。URLClassLoader通过URL集合来定位类的资源,它通常用于加载不在应用类路径(ClassPath)内的额外类库。创建...

    dynamic-load-class-parent.zip

    3. **URLClassLoader**: 这是Java提供的一个可以加载指定URL位置上的类的类加载器。通过扩展URLClassLoader,我们可以加载不在标准类路径中的类,这对于动态加载非常有用。 4. **反射(Reflection)**: 反射API允许...

    java classLoader 的全面讲解

    2. URLClassLoader:Java提供了一个内置的URLClassLoader,可以直接从指定的URL加载类,方便构建分布式系统。 四、类加载的优化 1. 懒加载:只在真正使用到某个类时才加载,减少启动时的内存占用。 2. 分类加载:...

    加载jar包中的spring配置文件

    7. **SpringDemo**:这可能是项目中的一个示例或演示,展示了如何加载和使用类路径下的Spring配置文件,以及如何集成其他库,如MyBatis。 综上所述,"加载jar包中的spring配置文件"是一个关键的Java开发实践,它...

Global site tag (gtag.js) - Google Analytics