项目 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虚拟机(JVM)中。以下是对这个主题的详细解析...
它们按照层次结构工作,遵循"委托模型",即从顶层的启动类加载器开始尝试加载类,如果找不到则逐级向下委托。 要实现动态加载jar文件,我们需要创建自定义的类加载器。这个类加载器需要继承`java.lang.ClassLoader`...
### Java动态加载类详解 Java动态加载类是Java编程中一项强大的特性,它允许程序在运行时决定并加载具体的类,这为实现高度灵活、可扩展的系统提供了基础。本文将深入探讨Java动态加载类的概念、应用场景以及其实现...
通过Class类的forName()方法,我们能够根据类名加载类,即使该类在运行时并未被加载到JVM(Java虚拟机)中。例如: ```java try { Class<?> clazz = Class.forName("com.example.MyClass"); // 进一步的反射操作....
在Java中,类加载器负责查找并加载类到Java虚拟机中。我们可以通过自定义类加载器来实现热加载。例如,`MemoryClassLoader.java`可能就是一个自定义类加载器的实现,它可以在内存中动态加载或更新类。 **JarinJAR**...
在Java编程语言中,动态加载类机制是一种强大的功能,它允许程序在运行时根据需要加载新的类或资源,而不是在编译时确定所有类。这种技术对于提高软件的灵活性、可扩展性和模块化至关重要,特别是在大型系统和插件式...
在Java编程中,动态编译代码并热加载类是一项重要的技术,它允许程序在运行时修改或添加新的类,而无需重启应用。这种能力对于快速迭代开发、调试和性能优化非常有用。本主题将深入探讨Java中的动态编译与热加载机制...
通过反射,我们可以动态地加载类、创建对象、访问和修改字段、调用方法等。本文将深入探讨Java反射机制,并通过一个具体的示例来演示如何使用反射动态加载实例类。 #### 一、Java反射概述 Java反射API主要由以下类...
- 动态加载类虽然功能强大,但是使用不当可能会导致程序性能问题和安全问题,因为动态加载类需要在运行时解析类名,这个过程可能会比静态加载类更耗时,并且可能会加载一些不安全的类。 - 在处理异常时,要正确处理`...
在Java中,类加载器(ClassLoader)是负责加载类到JVM中的核心组件。默认情况下,系统类加载器会搜索`CLASSPATH`环境变量或 `-cp`/`-classpath`命令行选项指定的路径下的`.class`文件。但是,我们可以通过自定义类...
在Java中,类加载器负责查找并加载类的字节码文件(.class文件)。这些字节码文件通常位于类路径(ClassPath)中定义的位置。Java虚拟机(JVM)有多个内置的类加载器,如Bootstrap ClassLoader、Extension ...
1. 加载类:使用`Class.forName()`加载指定的类。 2. 获取方法:使用`getMethod()`或`getDeclaredMethod()`,传入方法名和参数类型,获取`Method`对象。 3. 创建对象:如果需要,使用`Constructor.newInstance()`...
总结来说,Java动态加载数据库驱动的核心在于利用 `ClassLoader` 在运行时加载特定的数据库驱动类,避免了因为静态加载所有驱动而可能导致的冲突问题,提高了代码的灵活性和适应性。同时,这种方式还允许在运行时...
当我们谈论“Java实现的面向接口的动态加载驱动的方法”,我们实际上在讨论如何在运行时动态地加载实现了特定接口的类,以便于在不修改原有代码的情况下,插入新的功能或替换旧的实现。 以MySQL数据库驱动为例,...
- 使用`Class.forName(String className)`或`Class.forName(String className, boolean initialize, ClassLoader loader)`方法显式加载类。 - 使用`ClassLoader.loadClass(String name)`方法显式加载类。 其中,`...
### JAVA类加载机制与动态代理 #### 一、类加载机制 ##### 1.1 类加载的时机 类加载机制负责将描述类的数据从`.class`文件加载到内存,并进行必要的校验、转换解析和初始化,使之成为可以被Java虚拟机直接使用的...
类加载器在Java中扮演着至关重要的角色,不仅负责加载类,还维护了类的层次关系,确保了系统的稳定性和安全性。通过理解和掌握类加载器的工作原理及其不同类型的加载器,可以帮助开发者更好地管理Java应用程序的依赖...
Java 动态类加载机制研究及应用是基于 Java 虚拟机(JV M)机制的,旨在实现 Java 应用程序中动态加载类文件,而不影响其他功能模块的正常运行。为了实现这个目标,需要对 Java 类加载器的体系结构、动态类加载机制...
在Java编程中,动态编译和加载类是一种高级特性,它允许程序在运行时编译源代码并将其加载到Java虚拟机(JVM)中。这种能力对于开发灵活性高、可扩展性强的应用程序非常有用,比如在服务器端处理动态生成的代码、...