「java动态加载jar中」java动态加载和静态加载

博主:adminadmin 2022-11-25 03:58:11 46

今天给各位分享java动态加载jar中的知识,其中也会对java动态加载和静态加载进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

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中的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-25,除非注明,否则均为首码项目网原创文章,转载请注明出处。