初学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文件示例,轻松实现插件式开发
有些项目需要(根据机型)动态加入jar包,该资源包含了一个在android工程中动态加载jar文件的小程序,注释详细,需要注意我们的jar文件是需要经过dx处理过的,可参考博客:...
JAVA动态加载JAR文件以及反射调用其方法
该资源包含了一个动态加载jar文件中图片的简单demo,简单易懂。
spring的bean动态加载则需要对相应的bean进行动态注册,以及jar与class文件动态加载。测试示例中是spring boot 的部分代码,动态加载的内容为接口实现类,且初始化时加载本地的实现类,动态加载后改为非程序加载目录...
该资源包含了一个动态加载jar文件的源码,简单易懂。
该类加载器用于从指向 JAR 文件和目录的 URL 的搜索路径加载类和资源。如果不是以该字符结束,则认为该 URL 指向一个将根据需要打开的 JAR 文件pac
apk文件中添加jar文件 ,baksmali,apktool,jar2dex
Java 自动加载JAR文件并运行其中的类方法
首先第一个是 jar 文件的制作,Java 里面直接把 .class 文件打包到 .jar 文件里面就可以了,但是 Android 的 Dalvik VM 是不认 Java ...要动态加载其它类,可以用的 Class Loader 有: DexClassLoader,PathClassLoader
springmvc项目中如何加载jar包中的spring配置文件
动态加载jdbc Jar包连接数据库,生成压力测试jmter需要的数据文件。
springboot 、java类热加载、jarinjar、动态编译、自动引用依赖
java程序如果有引入图片的话,生成jar文件会有两种选择: 一种是在jar文件外部导入图片。 另一种是把图片集成进jar文件中,直接打开jar文件即可。 孰优孰劣,下载下来自己体会一下。
javaEE的一些jar包有antlr.jar standard.jar asm.jar aspectjweaver.jar commons-beanutils.jar commons-digester.jar log4j-1.2.15 struts.jar strutstest-2.1.0.jar 等
主要介绍了Java 动态加载jar和class文件实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
android 插件化动态加载jar 有时候会看到一些应用对应的SDcard里的文件夹里有 ***.jar 等文件,现在明白这些文件大概是用来做应用内自动更新用的。 打比方说,类似eclipse 可以通过预留接口,安装各种插件一样。 ...
根据输入的指定内容,搜索jar文件中的类; 使用需要有java环境,干Java的应该不需要过多解释吧! 单文件,双击即可运行~ 使用步骤: 1、添加需要检索的所有jar包 2、输入关键词进行搜索,即可定位类文件 配合反...
qhs主要用Java语言编写,可在WindowsXP专业版、Linux等操作系统安装、运行...qhs2.3新增的功能:动态加载jar文件、动态加载服务模块。qhs2.3-inst.jar的下载地址见需在本站查找、下载的qhs2.3-download-addresses.txt。