博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 从Jar文件中动态加载类
阅读量:6091 次
发布时间:2019-06-20

本文共 2523 字,大约阅读时间需要 8 分钟。

由于开发的需要,需要根据配置动态加载类,所以简单测试了一下JAVA动态加载类

定义接口

package loader;public interface HelloIface {    public String hello();        public String sayHi(String name);}

实现接口

在其他插件类实现此接口,并导出为jar,如D:/tmp/test.jar

package loader;public class HelloImpl implements HelloIface{	@Override	public String hello() {		return "hello,JAVA世界";	}	@Override	public String sayHi() {		return "Hi,JAVA World " + name;	}}

动态加载类

import java.lang.reflect.Method;import java.net.URL;import java.net.URLClassLoader;public class LoadJar {	public static void main(String[] args) {		String classPath = "loader.HelloImpl";// Jar中的所需要加载的类的类名		String jarPath = "file:///D:/tmp/test.jar";// jar所在的文件的URL		loadJar1(classPath, jarPath);		loadClass(classPath);		loadJar2(classPath, jarPath);		loadClass(classPath);	}	public static void loadJar1(String classPath, String jarPath) {		ClassLoader cl;		try {			// 从Jar文件得到一个Class加载器			cl = new URLClassLoader(new URL[] { new URL(jarPath) });			// 从加载器中加载Class			Class
 c = cl.loadClass(classPath); // 从Class中实例出一个对象 HelloIface impl = (HelloIface) c.newInstance(); // 调用Jar中的类方法 System.out.println(impl.hello()); System.out.println(impl.sayHi("zhangsan")); try { HelloIface impl2 = (HelloIface) Class.forName(classPath) .newInstance(); System.out.println(impl2.hello()); } catch (ClassNotFoundException e) { System.out.println("非系统加载器加载的JAR,不能通过Class.forName使用"); } } catch (Exception e) { e.printStackTrace(); } } public static void loadJar2(String classPath, String jarPath) { URLClassLoader urlLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); Class
 sysClass = URLClassLoader.class; try { //改变方法的可见性(即通过反映访问本来不可以访问的方法) Method method = sysClass.getDeclaredMethod("addURL", new Class[] { URL.class }); method.setAccessible(true); method.invoke(urlLoader, new URL(jarPath)); Class
 objClass = urlLoader.loadClass(classPath); Object instance = objClass.newInstance(); Method method2 = objClass.getDeclaredMethod("sayHi", new Class[]{ String.class}); System.out.println(method2.invoke(instance, "zhangsan")); HelloIface impl2 = (HelloIface) Class.forName(classPath).newInstance(); System.out.println(impl2.hello()); } catch (Exception e) { e.printStackTrace(); } } public static void loadClass(String classPath){ try { HelloIface impl2 = (HelloIface) Class.forName(classPath) .newInstance(); System.out.println(impl2.hello()); } catch (Exception e) { System.out.println("非系统加载器加载的JAR,不能通过Class.forName使用"); } }}

转载地址:http://ojqwa.baihongyu.com/

你可能感兴趣的文章
如何避免SHRINKDATABASE & SHRINKFILE 产生索引碎片(转载)
查看>>
【SSH网上商城项目实战02】基本增删查改、Service和Action的抽取以及使用注解替换xml...
查看>>
高阶函数简述 js
查看>>
Java CompletableFuture:allOf等待所有异步线程任务结束
查看>>
Highmaps网页图表教程之图表配置项结构与商业授权
查看>>
mysql 5.6.33发布
查看>>
java 获取URL链接 内容
查看>>
Linux 命令详解(二)awk 命令
查看>>
Android动态载入Dex机制解析
查看>>
PostgreSQL数据库中的常见错误
查看>>
jquery 控制 video 视频播放和暂停
查看>>
XCode调试多线程遭遇海森伯效应一例
查看>>
ie6下浮动使绝对定位元素莫名消失的问题
查看>>
FBReaderJ 1.6.3 发布,Android 电子书阅读器
查看>>
Java编程常见问题汇总(四)
查看>>
Hadoop 学习系列(四)之 MapReduce 原理讲解
查看>>
函数throttle、debounce介绍
查看>>
源码阅读:SDWebImage(三)——NSData+ImageContentType
查看>>
十六、类的真正形态
查看>>
spring-cloud Sleuth
查看>>