Java从Jar文件中动态加载类
动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行。
下面通过一个实例来直观演示:
第一:定义一个抽象类 AbstractAction (稍后换成接口的实例)
package com.java.loader;
public abstract class AbstractAction {
public abstract String action();
}
第二:写个实体类继承一下 TestAction
package com.java.jarloader;
import com.java.loader.AbstractAction;
public class TestAction extends AbstractAction{
public String action() {
System.out.println("I am working ! ");
return "this ActionTest class";
}
}
第三:将TestAction所在的包导出成jar包的方式,eclipse中直接export即可,放到指定目录,此处放在
D:\jarload\test.jar
放好后,删除TestAction文件和package。
第四:写个main函数测试下 TestMain (这里比较无聊,写了个从文件读的方式获取jar路劲,路径就是上面提到的jar所在的位置)
package com.java.main; import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.net.URL;
import java.net.URLClassLoader;
import com.java.loader.AbstractAction;
import com.java.loader.AbstractAction; /**
*
* 两种方式
* @author minggang.wumg
*
*/ public class TestMain { public static void main(String[] args) {
try {
//第一种 配置成文件格式
File file = new File("D:\\jarload\\test.txt");
BufferedReader in = new BufferedReader(new FileReader(file));
String s = new String();
while ((s = in.readLine()) != null) { URL url = new URL(s);
s = null; URLClassLoader myClassLoader = new URLClassLoader(new URL[] { url }, Thread.currentThread()
.getContextClassLoader());
Class<? extends AbstractAction> myClass = (Class<? extends AbstractAction>)
myClassLoader.loadClass("com.java.jarloader.TestAction");
AbstractAction action = (AbstractAction) myClass.newInstance();
String str = action.action();
System.out.println(str); //第二种
URL url1 = new URL("file:D:/jarload/test.jar");
URLClassLoader myClassLoader1 = new URLClassLoader(new URL[] { url1 }, Thread.currentThread() .getContextClassLoader());
Class<?> myClass1 = myClassLoader1.loadClass("com.java.jarloader.TestAction");
AbstractAction action1 = (AbstractAction) myClass1.newInstance();
String str1 = action1.action();
System.out.println(str1);
}
} catch (Exception e) {
e.printStackTrace();
}
}
第五:运行结果:

参考:http://www.cnblogs.com/Bonker/p/5445734.html
Java从Jar文件中动态加载类的更多相关文章
- Java运行时动态加载类之ClassLoader
https://blog.csdn.net/fjssharpsword/article/details/64922083 *************************************** ...
- 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息
0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...
- [转载] Java中动态加载jar文件和class文件
转载自http://blog.csdn.net/mousebaby808/article/details/31788325 概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下 ...
- Java_Java中动态加载jar文件和class文件
转自:http://blog.csdn.net/mousebaby808/article/details/31788325 概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下 ...
- Java动态加载类在功能模块开发中的作用
Java中我们一般会使用new关键字实例化对象然后调用该对象所属类提供的方法来实现相应的功能,比如我们现在有个主类叫Web类这个类中能实现各种方法,比如用户注册.发送邮件等功能,代码如下: /* * ...
- 某APK中使用了动态注册BroadcastReceiver,Launcher中动态加载此APK出现java.lang.SecurityException异常的解决方法
在某APK中,通过如下方法动态注册了一个BroadcastReceiver,代码参考如下: @Override protected void onAttachedToWindow() { super. ...
- java动态加载类和静态加载类笔记
JAVA中的静态加载类是编译时刻加载类 动态加载类指的是运行时刻加载类 二者有什么区别呢 举一个例子 现在我创建了一个类 实现的功能假设为通过传入的参数调用具体的类和方法 class offic ...
- java reflect 初始学习 动态加载类
首先要理解Class类: 在java 的反射中,Class.forName("com.lilin.Office") 使用类的全名,这样获取,不仅仅表示了类的类类型,同时还代表着类的 ...
- Java动态加载类
详见:https://blog.csdn.net/zai_xia/article/details/80026325 扩展:java反射机制与动态加载类 https://www.cnblogs.com/ ...
随机推荐
- ocp 1Z0-047 61-130题解析
61. Evaluate the following SQL statements that are issued in the given order:CREATE TABLE emp(emp_no ...
- HDU 5775 Bubble Sort (线段树)
Bubble Sort 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 Description P is a permutation of t ...
- bzoj 2190 仪仗队(欧拉函数)
2190: [SDOI2008]仪仗队 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2245 Solved: 1413[Submit][Statu ...
- TQJson序列和还原clientdataset.data
TQJson是QDAC开源项目的JSON对象,其特点是跨平台,功能强大. 序列 procedure TForm2.Button2Click(Sender: TObject);var AJson: TQ ...
- ios页面传值的几种方法
1.属性2.方法3.代理方法4.SharedApplication5.NSUserdefault6.通过一个单例的class来传递 属性这种方法传值挺方便的,只需要拿到它的指针,如果重新声明一个指针, ...
- 关于CoreData和SQLite多线程访问时的线程安全问题
数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱.IOS中常用的两种数据持久化存储方式:CoreData和SQLite,两 ...
- C#中的表达式树简介
表达式树是.NET 3.5之后引入的,它是一个强大灵活的工具(比如用在LINQ中构造动态查询). 先来看看Expression类的API接口: using System.Collections.Obj ...
- Listview上下滚动崩溃
利用CursorAdapter在ListView中显示Cursor中不同同类型的item,加载均正常,滚动时报如下错误: 11-28 15:18:16.703: E/InputEventReceive ...
- MVC神韵---你想在哪解脱!(十)
增加追加数据的方法和视图 现在我们将要在数据库中追加并保存一些数据.我们将要创建一个表单以及一些表单输入控件,用来输入数据信息.当用户提交表单时将把这些用户输入的信息保存在数据库中.我们可以通过在浏览 ...
- Nginx学习之十一-Nginx启动框架处理流程
Nginx启动过程流程图 下面首先给出Nginx启动过程的流程图: ngx_cycle_t结构体 Nginx的启动初始化在src/core/nginx.c的main函数中完成,当然main函数是整个N ...