`
yangkai0332
  • 浏览: 10744 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java 动态加载类问题

阅读更多
项目 DD 如下描述:
有一个接口类   A.
有个动态载入指定类  B.
动态载入类 B 是通过传递一个参数classPath='com.xxx.test.aImpl' 来进行动态加载指定类.

DD 发布运行正常.
当将 DD 打包成jar放在 EE 项目下用的时候,出现:
java.io.FileNotFoundException
java.lang.ClassNotFoundException

EE 项目中有 A 接口实现类.调用 B 的动态加载.出现找不到接口 A .

不打包执行正常,打包后就出现错误.
/**
 * 自定义的类加载器
 */
public class DynaLoadClass extends ClassLoader {
	private static String PATH = null;
	
	@SuppressWarnings("unchecked")
	protected Class findClass(String name) throws ClassNotFoundException {
		try {
			String classPath = getClassPath(name);
			FileInputStream fin = new FileInputStream(classPath);
			File cf = new File(classPath);
			byte[] raw = new byte[(int) cf.length()];
			fin.read(raw);
			fin.close();
			return defineClass(name, raw, 0, raw.length);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return super.findClass(name);
	}
	/**
	 * 得到Class的绝对路径
	 * @param name
	 * @return
	 */
	private String getClassPath(String name) {
		if(PATH == null){
			PATH = DynaLoadClass.class.getClassLoader().getResource("").toString()
			.replace("file:/", "").replace("%20", " ");
		}
		return PATH + name.replace('.', File.separatorChar) + ".class";
	}
}

该怎么解决啊.求救!
---16:23---
问题解决.
当查找接口的时候,就直接去jar包中找.
@SuppressWarnings("unchecked")
	protected Class findClass(String name) throws ClassNotFoundException {
		try {
			if(name.equals("com.xxxx.gui.IGui")){
				return getIGuiPath();
			}
			String classPath = getClassPath(name);
			FileInputStream fin = new FileInputStream(classPath);
			File cf = new File(classPath);
			byte[] raw = new byte[(int) cf.length()];
			fin.read(raw);
			fin.close();
			return defineClass(name, raw, 0, raw.length);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return super.findClass(name);
	}

	/**
	 * 得到Class的绝对路径
	 * 
	 * @param name
	 * @return
	 */
	private String getClassPath(String name) {
		if (PATH == null) {
			PATH = DynaLoadClass.class.getClassLoader().getResource("")
					.toString().replace("file:/", "").replace("%20", " ");
		}
		return PATH + name.replace('.', File.separatorChar) + ".class";
	}

	@SuppressWarnings("unchecked")
	private Class getIGuiPath() throws ClassNotFoundException, MalformedURLException {
		String path = DynaLoadClass.class.getClassLoader().getResource("").toString().replace("WEB-INF/classes/", "WEB-INF/lib/xxxxxx.jar");
		URL url = new URL(path);
		URLClassLoader loader = new URLClassLoader(new URL[] { url });
		return loader.loadClass("com.xxxx.gui.IGui");
	}
分享到:
评论

相关推荐

    Java类动态加载(一)——java源文件动态编译为class文件

    这篇博客“Java类动态加载(一)——java源文件动态编译为class文件”可能主要探讨了如何在运行时将Java源代码(.java)编译成对应的字节码文件(.class),并将其加载到Java虚拟机(JVM)中。以下是对这个主题的详细解析...

    Java 动态加载jar文件示例

    它们按照层次结构工作,遵循"委托模型",即从顶层的启动类加载器开始尝试加载类,如果找不到则逐级向下委托。 要实现动态加载jar文件,我们需要创建自定义的类加载器。这个类加载器需要继承`java.lang.ClassLoader`...

    java动态加载类

    ### Java动态加载类详解 Java动态加载类是Java编程中一项强大的特性,它允许程序在运行时决定并加载具体的类,这为实现高度灵活、可扩展的系统提供了基础。本文将深入探讨Java动态加载类的概念、应用场景以及其实现...

    java 动态加载jar包

    通过Class类的forName()方法,我们能够根据类名加载类,即使该类在运行时并未被加载到JVM(Java虚拟机)中。例如: ```java try { Class<?> clazz = Class.forName("com.example.MyClass"); // 进一步的反射操作....

    springboot+java类热加载

    在Java中,类加载器负责查找并加载类到Java虚拟机中。我们可以通过自定义类加载器来实现热加载。例如,`MemoryClassLoader.java`可能就是一个自定义类加载器的实现,它可以在内存中动态加载或更新类。 **JarinJAR**...

    动态加载类机制JAVA

    在Java编程语言中,动态加载类机制是一种强大的功能,它允许程序在运行时根据需要加载新的类或资源,而不是在编译时确定所有类。这种技术对于提高软件的灵活性、可扩展性和模块化至关重要,特别是在大型系统和插件式...

    Java语言-动态编译代码并热加载类

    在Java编程中,动态编译代码并热加载类是一项重要的技术,它允许程序在运行时修改或添加新的类,而无需重启应用。这种能力对于快速迭代开发、调试和性能优化非常有用。本主题将深入探讨Java中的动态编译与热加载机制...

    Java反射动态加载实例类

    通过反射,我们可以动态地加载类、创建对象、访问和修改字段、调用方法等。本文将深入探讨Java反射机制,并通过一个具体的示例来演示如何使用反射动态加载实例类。 #### 一、Java反射概述 Java反射API主要由以下类...

    Java动态加载类小实验.pdf

    - 动态加载类虽然功能强大,但是使用不当可能会导致程序性能问题和安全问题,因为动态加载类需要在运行时解析类名,这个过程可能会比静态加载类更耗时,并且可能会加载一些不安全的类。 - 在处理异常时,要正确处理`...

    JAVA动态加载JAR zip包

    在Java中,类加载器(ClassLoader)是负责加载类到JVM中的核心组件。默认情况下,系统类加载器会搜索`CLASSPATH`环境变量或 `-cp`/`-classpath`命令行选项指定的路径下的`.class`文件。但是,我们可以通过自定义类...

    Java技术----实现JAVA的动态类载入机制

    在Java中,类加载器负责查找并加载类的字节码文件(.class文件)。这些字节码文件通常位于类路径(ClassPath)中定义的位置。Java虚拟机(JVM)有多个内置的类加载器,如Bootstrap ClassLoader、Extension ...

    反射,动态加载指定类调用类中的方法

    1. 加载类:使用`Class.forName()`加载指定的类。 2. 获取方法:使用`getMethod()`或`getDeclaredMethod()`,传入方法名和参数类型,获取`Method`对象。 3. 创建对象:如果需要,使用`Constructor.newInstance()`...

    详解Java动态加载数据库驱动

    总结来说,Java动态加载数据库驱动的核心在于利用 `ClassLoader` 在运行时加载特定的数据库驱动类,避免了因为静态加载所有驱动而可能导致的冲突问题,提高了代码的灵活性和适应性。同时,这种方式还允许在运行时...

    Java 实现的面向接口的动态加载驱动的方法

    当我们谈论“Java实现的面向接口的动态加载驱动的方法”,我们实际上在讨论如何在运行时动态地加载实现了特定接口的类,以便于在不修改原有代码的情况下,插入新的功能或替换旧的实现。 以MySQL数据库驱动为例,...

    Java类加载器.pdf

    - 使用`Class.forName(String className)`或`Class.forName(String className, boolean initialize, ClassLoader loader)`方法显式加载类。 - 使用`ClassLoader.loadClass(String name)`方法显式加载类。 其中,`...

    JAVA类加载机制与动态代理

    ### JAVA类加载机制与动态代理 #### 一、类加载机制 ##### 1.1 类加载的时机 类加载机制负责将描述类的数据从`.class`文件加载到内存,并进行必要的校验、转换解析和初始化,使之成为可以被Java虚拟机直接使用的...

    java类加载器

    类加载器在Java中扮演着至关重要的角色,不仅负责加载类,还维护了类的层次关系,确保了系统的稳定性和安全性。通过理解和掌握类加载器的工作原理及其不同类型的加载器,可以帮助开发者更好地管理Java应用程序的依赖...

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

    Java 动态类加载机制研究及应用是基于 Java 虚拟机(JV M)机制的,旨在实现 Java 应用程序中动态加载类文件,而不影响其他功能模块的正常运行。为了实现这个目标,需要对 Java 类加载器的体系结构、动态类加载机制...

    动态编译、加载java类

    在Java编程中,动态编译和加载类是一种高级特性,它允许程序在运行时编译源代码并将其加载到Java虚拟机(JVM)中。这种能力对于开发灵活性高、可扩展性强的应用程序非常有用,比如在服务器端处理动态生成的代码、...

Global site tag (gtag.js) - Google Analytics