「java动态加载jar中」java动态加载和静态加载
今天给各位分享java动态加载jar中的知识,其中也会对java动态加载和静态加载进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、java可以动态加载一个jar包,并且调用里面的类和方法吗?
- 2、java 加载动态链接库怎么使用相对路径
- 3、java classpath 加载jar包问题
- 4、关于java动态加载jar的问题?
- 5、在加载类时,如何指定所使用的jar包
- 6、如何在Java运行的时候动态加载一个jar包到classpath里面
java可以动态加载一个jar包,并且调用里面的类和方法吗?
首先你说的
”只能搜索非jar的*.class文件“的结论是不对的。
实际上是可以load的
读取目录下所有jar的方法是使用
-djava.ext.dirs=mydir/
java 加载动态链接库怎么使用相对路径
java 加载动态链接库使用相对路径一般是不可以直接从jar文件中加载目标dll文件,需要分两步:
1、从jar中拷贝dll文件
public static void loadJarDll(String name) throws IOException {
InputStream in = MyClass.class.getResourceAsStream(name);
byte[] buffer = new byte[1024];
int read = -1;
File temp = File.createTempFile(name, "");
FileOutputStream fos = new FileOutputStream(temp);
while((read = in.read(buffer)) != -1) {
fos.write(buffer, 0, read);
}
fos.close();
in.close();
System.load(temp.getAbsolutePath());
}
2、创建dll所在的相对路径,用临时了路径过度:
ArrayListString bins = new ArrayListString(){{
add("/nm/metadata/bin/dependence1.dll");
add("/nm/metadata/bin/dependence2.dll");
add("/nm/metadata/bin/dependence3.dll");
add("/nm/metadata/bin/dependence4.dll");
add("/nm/metadata/bin/jniBin.dll");
}};
new File(new File(System.getProperty("java.io.tmpdir")), name)
java classpath 加载jar包问题
首先你说的 ”只能搜索非jar的*.class文件“的结论是不对的。 实际上是可以load的
读取目录下所有jar的方法是使用 -Djava.ext.dirs=mydir/
关于java动态加载jar的问题?
设我们有一个hello.jar文件,里面有一个Util类,我们希望在运行期调将这个jar包放入到我们运行环境并且调用里面的Util.getVersion方法。怎么实现?
在java中,我们的类都是通过ClassLoader来加载的,同时ClassLoader具有层级关系,当某个类找不到时,它会去他的父类加载器去寻找,如果依然找不到,就抛出ClassNotFoundException了。
为了动态加载hello.jar里面的Util类,我们需要将这个jar包放入到我们的类加载器中去,然后再获取里面的类。如下面的代码。
// 位于hello.jar
package com.flyingzl;
public class Util {
public static void getVersion(){
System.out.println("java version: " + System.getProperty("java.version"));
}
}
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class Main {
public static void main(String[] args) {
URL[] urls = new URL[] {};
MyClassLoader classLoader = new MyClassLoader(urls, null);
try {
classLoader.addJar(new File("c:/hello.jar").toURI().toURL());
Class? clazz = classLoader.loadClass("com.flyingzl.Util");
Method method = clazz.getDeclaredMethod("getVersion");
method.invoke(null);
classLoader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
static class MyClassLoader extends URLClassLoader {
public MyClassLoader(URL[] urls) {
super(urls);
}
public MyClassLoader(URL[] urls, ClassLoader parent) {
super(urls, parent);
}
public void addJar(URL url) {
this.addURL(url);
}
}
}
注意:这里仅仅是为了展示如何动态加载jar包,代码写得很粗,生产代码需要有更完善的异常处理。我们只关心如何动态加载jar包即可。
动态加载jar包,需要用到java.net.URLClassLoader这个类,它可以指定一个路径将jar包或者classes文件加载到类空间。加载完毕后,直接调用loadClass就可以加载指定的类,然后通过反射生成实例或者调用方法即可。
其实,Tomcat等服务器也利用了此思路,比如每一个web应用启动时,它都会自动加载其下的lib文件夹下的jar包。
运行程序,我们就可以看到程序正常输出:
java version: 1.7.0_03
在加载类时,如何指定所使用的jar包
定制自己的类加载器,从指定的jar包中加载类就行了
一般动态加载类都是直接用Class.forName()这个方法,但这个方法只能创建程序中已经引用的类,并且只能用包名的方法进行索引,比如 Java.lang.String,不能对一个.class文件或者一个不在程序引用里的.jar包中的类进行创建。但使用URLClassLoader 就可以直接根据创建一个单独的.class文件,并且每当重新载入后并实例化后都是最新的方法。类似于jsp,当你在eclipse中改了一个jsp并且存储后,只要刷新页面就可以得到最新的结果而不用重新启动服务器。
URLClassLoader是在java.net包下的一个类。他的构造函数输入参数需要输入1个URL数组。假设我们有一个编译后的class文件在 C:\URLClass\testClass.class中,URLClassLoader进行加载,其中有个方法为test,我们需要动态加载这个类并且运行test方法
Java代码
File xFile=new File("d:/xx.jar");
URL xUrl= xFile.toURL() ;
URLClassLoader ClassLoader=new URLClassLoader(new URL[]{ xUrl });
Class xClass=ClassLoader.loadClass("testClass");
Object xObject=xClass.newInstance();
Method xMethod=xClass.getDeclaredMethod("test");
如何在Java运行的时候动态加载一个jar包到classpath里面
给你个例子自己看一下吧不会了再追问,注释基本都有了
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 import java.io.img id="selectsearch-icon" src="" alt="搜索"File;import java.lang.reflect.a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3ryc3nvD4mWT4rjnzmvw-0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPjRdP1mdPj6dn10dnWf3nHmd" target="_blank" class="baidu-highlight"Method/a;import java.net.a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3ryc3nvD4mWT4rjnzmvw-0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPjRdP1mdPj6dn10dnWf3nHmd" target="_blank"class="baidu-highlight"URL/a;import java.net.a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3ryc3nvD4mWT4rjnzmvw-0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPjRdP1mdPj6dn10dnWf3nHmd" target="_blank"class="baidu-highlight"URL/aa href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3ryc3nvD4mWT4rjnzmvw-0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPjRdP1mdPj6dn10dnWf3nHmd" target="_blank" class="baidu-highlight"Class/aLoader;import java.util.List; public final a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3ryc3nvD4mWT4rjnzmvw-0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPjRdP1mdPj6dn10dnWf3nHmd" target="_blank"class="baidu-highlight"class/a Exta href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3ryc3nvD4mWT4rjnzmvw-0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPjRdP1mdPj6dn10dnWf3nHmd" target="_blank" class="baidu-highlight"Class/apathLoader { private static a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3ryc3nvD4mWT4rjnzmvw-0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPjRdP1mdPj6dn10dnWf3nHmd" target="_blank" class="baidu-highlight"Method/a adda href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3ryc3nvD4mWT4rjnzmvw-0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPjRdP1mdPj6dn10dnWf3nHmd" target="_blank" class="baidu-highlight"URL/a = initAdda href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3ryc3nvD4mWT4rjnzmvw-0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPjRdP1mdPj6dn10dnWf3nHmd" target="_blank" class="baidu-highlight"Method/a(); private static URLClassLoader classloader = (URLClassLoader) ClassLoader.getSystemClassLoader(); /** * a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3ryc3nvD4mWT4rjnzmvw-0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPjRdP1mdPj6dn10dnWf3nHmd" target="_blank" class="baidu-highlight"初始化/aaddUrl 方法. * @return 可访问addUrl方法的Method对象 */ private static Method initAddMethod() { try { Method add = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class }); add.setAccessible(true); return add; } catch (Exception e) { throw new RuntimeException(e); } } /** * 加载jar classpath。 */ public static void loadClasspath() { ListString files = getJarFiles(); for (String f : files) { loadClasspath(f); } ListString resFiles = getResFiles(); for (String r : resFiles) { loadResourceDir(r); } } private static void loadClasspath(String filepath) { File file = new File(filepath); loopFiles(file); } private static void loadResourceDir(String filepath) { File file = new File(filepath); loopDirs(file); } /** *//** * 循环遍历目录,找出所有的资源路径。 * @param file 当前遍历文件 */ private static void loopDirs(File file) { // 资源文件只加载路径 if (file.isDirectory()) { addURL(file); File[] tmps = file.listFiles(); for (File tmp : tmps) { loopDirs(tmp); } } } /** * 循环遍历目录,找出所有的jar包。 * @param file 当前遍历文件 */ private static void loopFiles(File file) { if (file.isDirectory()) { File[] tmps = file.listFiles(); for (File tmp : tmps) { loopFiles(tmp); } } else { if (file.getAbsolutePath().endsWith(".jar") || file.getAbsolutePath().endsWith(".zip")) { addURL(file); } } } /** * 通过filepath加载文件到classpath。 * @param filePath 文件路径 * @return URL * @throws Exception 异常 */ private static void addURL(File file) { try { addURL.invoke(classloader, new Object[] { file.toURI().toURL() }); } catch (Exception e) { } } /*** * 从配置文件中得到配置的需要加载到classpath里的路径集合。 * @return */ private static ListString getJarFiles() { // TODO 从properties文件中读取配置信息 如果不想配置 可以自己new 一个ListString 然后把 jar的路径加进去 然后返回 return null; } /** * 从配置文件中得到配置的需要加载classpath里的资源路径集合 * @return */ private static ListString getResFiles() { //TODO 从properties文件中读取配置信息略 如果不想配置 可以自己new 一个ListString 然后把 jar的路径加进去 然后返回 额 如果没有资源路径为空就可以了 return null; } public static void main(String[] args) { ExtClasspathLoader.loadClasspath(); }}
java动态加载jar中的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java动态加载和静态加载、java动态加载jar中的信息别忘了在本站进行查找喔。
发布于:2022-11-25,除非注明,否则均为
原创文章,转载请注明出处。