java动态加载代码 java 动态加载jar包

Java如何实现反射静态加载和动态加载实例代码详解1.Java动态加载类和静态加载类的区别
new创建对象的方式称作为静态加载 , 而使用Class.forName("XXX")称作为动态加载 , 它们俩本质的区别在于静态加载的类的源程序在编译时期加载(必须存在),而动态加载的类在编译时期可以缺席(源程序不必存在) 。
2.为什么需要动态加载类
对于我自己的理解,动态加载类增加了程序的灵活性 。比如一个程序中有50个功能,但你可能只会使用其中的一个 , 如果你用的是静态加载的方式,你必须在编译前提供100个功能的所有定义,否则无法编译通过,若你使用的是动态加载机制,则不需要如此大费周章 , 用哪一个就定义哪一个即可 。
静态加载:
public class Office_Static {
public static void main(String[] args) {
//new 创建对象,是静态加载类,在编译时刻就需要加载所有的可能使用到的类
if("Word".equals(args[0])){
Word w = new Word();
w.start();
}
if("Excel".equals(args[0])){
Excel e = new Excel();
e.start();
}
}
}
这个程序编译时必须有Word和Excel这两个类存在才行,即使判断后用不到Excel也要加载
动态加载:
接口OfficeAble :
【java动态加载代码 java 动态加载jar包】public interface OfficeAble {
public void start();}
关于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工程在运行的时候怎么动态加载另一个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包选中要加载jar的工程,右击出现菜单Build Path ---Configure Build Path出现Properties选择JavaBuildPath Libraries点击Add External JARs......就可加载你要加载的jar包了,jar包加载到工程里面的是Jar的路径 并没有把Jar包里面的内容复制进去,如果你把工程复制到另一台计算机上的运行又得重新加载jar包 。。。。。。这是个人理解,不知道是否能解决你的问题 。
java动态加载代码的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于java 动态加载jar包、java动态加载代码的信息别忘了在本站进行查找喔 。

    推荐阅读