Java 从Jar文件中动态加载类
来源:互联网 发布:人工智能 军民融合 编辑:程序博客网 时间:2024/05/21 11:04
Java: 使用Java中的ClassLoader搭配上反射功能就能实现从Jar文件中动态加载类
由于开发的需要,需要根据配置动态加载类,所以简单测试了一下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<URLClassLoader> 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使用"); } }}
0 0
- Java 从Jar文件中动态加载类
- java 源代码中动态加载JAR文件中的类
- Java动态加载jar文件
- Java中动态加载jar文件和class文件
- Java中动态加载jar文件和class文件
- Java中动态加载jar文件和class文件
- JAVA 动态(手动)加载jar文件
- Java 动态加载jar和class文件
- 动态加载jar文件
- Java动态加载jar
- Java动态加载Jar
- java中动态加载文件
- java中如何从远程主机(服务器)或本地加载jar文件
- Java动态类加载器(加载外部jar包类 读取资源文件)
- 从Java档案(JAR)中读取文件
- 从 Java 档案 (JAR) 中读取文件
- 从 Java 档案(JAR) 中读取文件
- 从Java档案(JAR)中读取文件
- ORACLE配置tnsnames.ora文件实例
- Unity爆炸检测
- linux中用wine加载使用TortoiseSVN
- 【ural】1960. Palindromes and Super Abilities【Palindromic Tree】
- Android APK反编译就这么简单 详解(附图)
- Java 从Jar文件中动态加载类
- OpenNI+VS2010环境配置
- 最简单的基于librtmp的示例:发布H.264(H.264通过RTMP发布)
- 生成release版本的Android系统 --签名
- zookeeper 安装 windows环境
- php根据出生日期获取年龄,生日数据类型为date型
- Letter Combinations of a Phone Number -- leetcode
- opencv2鼠标选定感兴趣区域用反投影算法检测相似部分
- 如何处理超出 GL_MAX_TEXTURE_SIZE 的图片