本文目录一览:
- 1、一个java工程在运行的时候怎么动态加载另一个java工程?
- 2、关于java动态加载jar的问题?
- 3、java可以动态加载一个jar包,并且调用里面的类和方法吗?
- 4、java 加载动态链接库怎么使用相对路径
一个java工程在运行的时候怎么动态加载另一个java工程?
直接写上 new ClassFromPrj2(); 不用你手工“加载”,Java 中加载默认是由 JVM 虚拟器自动完成的,只要引用到的类ClassFromPrj2 在 classpath 中即可。等你达到中级水平,知道 Java Reflection 和 ClassLoader 之后你就知道是怎么回事了。
我是假设 loadJavaPrj 是第一个工程,假设它使用了第二个工程的类 ClassFromPrj2 的话,那就是
ClassFromPrj2 worker = new ClassFromPrj2();
worker.xxx();
你在运行中需要确保的是:prj2 这个工程的 jar 或 class folder 出现在 java -cp XXX 这个 classpath (-classpath 或 -cp) 参数列表中就可以了。
你在eclipse 项目的 .classpath 文件中发现的东西表明你还是尝试了解工具的细节,但那个仅仅是 Eclipse 用来帮我们生成命令行参数的配置文件,最终我们需要知道 javac 或 java 这样的命令行需要什么参数,这一点一般书上和老师都会讲到(但他们一般不会讲解Eclipse怎么工作的)。
关于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
java可以动态加载一个jar包,并且调用里面的类和方法吗?
可以的
jar可以看成是一个存放很多class的的地方,jar包放入classpath后,其实只要能实现动态的加载类就可以实现题目中的需求了
技术是 java 反射机制,就是一个利用提供类全名而得到这个类实例的机制
通过反射得到Class这个类,然后可以得到关于这个类的方法,字段等相关信息
具体可以查看相关知识
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)