`
zhongzhao_2008
  • 浏览: 35979 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
最近访客 更多访客>>
社区版块
存档分类
最新评论

动态加载jar文件

阅读更多
   初学Java时教科书告诉我们,若要运行Java程序,必需为其设置环境变量。有时候为了实现某种功能(例如动态加载Class)我们需要在程序中来实现这个功能。我们经常使用的Eclipse就是很好的例子,它的所有插件的.jar文件都是放在plugin目录下的,如何加载这些包并使用其中的类成了一个棘手的问题。(关于Eclipse的类加载机制,大家可以参考《Contributing to Eclipse》p54)

下面我们就来看看,在程序中如何实现这个功能。
1、建立一个工程,并为其增加一个 Interface,命名为ActionInterface.java。该接口为使用者公开了一个方法,如下:

程序代码
package org.junesky.classPathTest;
public interface ActionInterface {
    public String action();
}

编译后,将该工程打包为.jar文件。
打包方法:
在包的顶级目录(也就是例子中的org所在的目录)建立一个名为MANIFEST.MF的文件,键入:Manifest-Version: 1.0保存。
在ms-doc窗口中键如命令:jar cvfm classLoader.jar MANIFEST.MF org/
其中classLoader.jar是打包后的文件名,org/是path。

2、建立一个新工程,将classLoader.jar导入,新建class文件MyAction并实现ActionInterface。如下:

程序代码
package org.junesky. MyAction;
import org.junesky.classPathTest. ActionInterface;
public class MyAction implements ActionInterface {
    public String action() {
        // TODO Auto-generated method stub
        return "------------------ok";
    }
}

编译后打包为classTest.jar。

3、新建一工程,将classLoader.jar和classTest.jar导入,新建class文件MyClassLoader.java并继承URLClassLoader。如下:

程序代码
package org.junesky.classPathTest;

import   java.net.URL;
import   java.net.URLClassLoader;

import org.junesky.classPathTest. ActionInterface;

public class ClassPathTest extends URLClassLoader {
    public ClassPathTest(URL url) {
        super(new URL[] { url });
    }

    public static Object test(String str , String cls) {
        try {
            URL url = new URL(str);
            ClassPathTest t = new ClassPathTest(url);

Class c = t.findClass(cls);
ActionInterface action = (ActionInterface)c.newInstance();

return action.action();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return "";
    }

    public static void main(String[] args) {
        try {
          
            System.out.println(
                ClassPathTest.test("file:D:/JavaTest/ClassTest2/lib/ MyAction.jar",
                        "org.junesky. MyAction. MyAction "));

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

编译通过执行,会看到控制台上打印出:
------------------ok

下面我们来看看,这个程序到底做了什么。首先,我们创建了一个接口ActionInterface,在利用URLClassLoader. findClass后,以这个接口创建对象的实例。在第二个jar文件中,我们创建了MyAction.java并实现了ActionInterface,在方法action中我们返回了一个字符串。接下来,我们利用URLClassLoader加载D:/JavaTest/ClassTest2/lib/ MyAction.jar,并以findClass查找并加载org.junesky. MyAction. MyAction类,为得到的Class生成实例:

Class c = t.findClass(cls);  // 加载类
ActionInterface action = (ActionInterface)c.newInstance();  // 生成对象实例

最后调用ActionInterface中声明的action方法打印出MyAction中返回的字符串。

以上代码仅仅是Java Class加载的使用方法的简单说明,在真正开发项目过程序中,往往还需要考虑更多的问题,以后我们再继续说明。
分享到:
评论

相关推荐

    Java 动态加载jar文件示例

    在Java编程语言中,动态加载jar文件是一种关键的特性,它允许程序在运行时加载新的类库或组件,而不是在编译时静态地链接。这种技术对于实现插件式开发或者模块化系统至关重要,因为它提供了灵活性和可扩展性。下面...

    android动态加载jar文件

    标题“android动态加载jar文件”指的是在Android应用中实现对.jar文件的运行时加载技术。这种技术通常涉及到Java的类加载器(ClassLoader)和Android的 DexClassLoader。在Android中,所有的Dalvik或ART字节码都是以...

    JAVA动态加载JAR文件

    JAVA动态加载JAR文件以及反射调用其方法

    android动态加载jar文件中的图片

    动态加载jar文件中的图片在Android中并非直接支持的功能,但通过自定义实现,我们可以绕过限制。关键在于正确地读取和解析jar文件,以及将图片数据转换为Android的`Bitmap`对象。这个过程涉及到了文件流操作、Zip...

    动态加载jar包

    默认情况下,JVM会使用系统类加载器来查找和加载类,但我们可以自定义类加载器来实现特定的加载逻辑,比如从特定的jar文件中加载类。 以下是动态加载jar包的基本步骤: 1. **创建自定义类加载器**:首先,我们需要...

    android动态加载jar

    2. 创建DexClassLoader实例,传入JAR文件路径、基类加载器、优化后的DEX文件路径和临时目录。 ```java File jarPath = new File("/path/to/your.jar"); File optimizedDexPath = context.getDir("optimized", ...

    动态加载jar

    在Android开发中,动态加载JAR文件是一种常见的技术,它允许程序在运行时加载和执行新的功能或服务,而无需重新编译和安装整个应用程序。这样的设计极大地提高了灵活性,使得应用能够实现模块化,便于更新和维护。...

    java 动态加载jar包

    // 创建并添加新的类加载器,加载插件文件 PluginClassLoader loader = new PluginClassLoader(pluginFile); pluginLoaders.put(pluginFile.getName(), loader); // 加载并初始化插件 loader.loadPlugin(); } ...

    android 动态加载jar代码

    下面将详细探讨Android如何实现动态加载jar文件及其相关知识点。 一、为什么要动态加载jar? 1. 扩展性:通过动态加载,可以在不更新主应用的情况下添加新功能,提高用户体验。 2. 维护:修复bug或添加新特性时,...

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

    spring的bean动态加载则需要对相应的bean进行动态注册,以及jar与class文件动态加载。测试示例中是spring boot 的部分代码,动态加载的内容为接口实现类,且初始化时加载本地的实现类,动态加载后改为非程序加载目录...

    eclipse中Jar 文件的创建与使用

    4. **动态加载**:在运行时,Java代码可以通过`ClassLoader`动态加载Jar文件中的类。 **注意事项** - 确保所有依赖的库都包含在Jar文件中,或者在运行时能正确地通过类路径找到。 - 如果Jar文件包含资源文件,例如...

    JAVA动态加载JAR zip包

    - 使用`java.util.zip`包中的`ZipFile`类来打开和读取ZIP或JAR文件。通过`ZipFile.entries()`获取所有条目,然后遍历这些条目,寻找`.class`文件。 - 对于每个`.class`文件,将其读入字节数组,准备调用`...

    JAR文件包及jar命令详解

    为了使JAR文件成为可执行文件,开发者需要在`MANIFEST.MF`中添加`Main-Class`字段,指定程序的入口点(即包含`public static void main(String[] args)`方法的类)。例如,如果主类位于`test`包下,名为`Test`,`...

    动态加载jar包的实现

    在Java编程环境中,动态加载jar包是一项重要的技术,...`CSClassLoaderUtil`是这样的类加载器的一个实例,它可能是用Java编写的一个实用工具类,具体实现细节可能包括jar文件的读取、类的加载以及双亲委派模型的遵循。

    apk文件中添加jar文件

    本篇文章将详细讲解如何在APK文件中添加JAR文件,以及涉及到的相关工具——baksmali、apktool和jar2dex。 首先,我们来理解一下JAR文件。Java Archive(JAR)文件是Java平台中用于存储类文件、资源文件和其他相关...

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

    在Java编程中,有时我们需要动态地加载外部JAR文件,并执行其中特定的类方法,这在插件系统、模块化应用或动态扩展性需求中尤为常见。本篇将详细讲解如何实现这一目标。 首先,理解JAR(Java Archive)文件是Java...

    jar文件如何打开或者jar文件关联到java

    ### 如何打开或关联JAR文件到Java 在软件开发领域,尤其是Java开发中,JAR(Java Archive)文件是一种非常常见的格式。JAR文件本质上是ZIP文件的一种扩展,用于打包Java类文件、资源文件和其他元数据。了解如何打开...

    java动态编译指定java文件且将java文件生成jar

    这个`createJar`方法接受一个类名和目标JAR文件,然后创建一个`JarOutputStream`,将对应的`.class`文件添加到JAR中。注意,类名需要转换为类路径格式,即使用`.`替换`/`。 结合以上两个部分,我们可以在运行时动态...

Global site tag (gtag.js) - Google Analytics