一个java工程在运行的时候怎么动态加载另一个java工程?

作用就类似在第一个java工程的.classpath文件中加入了第二个java工程的引用<classpath>......<classpathentrycombineac... 作用就类似在第一个java工程的.classpath文件中加入了第二个java工程的引用
<classpath>
......
<classpathentry combineaccessrules="false" kind="src" path="/JavaProjectXXX"/>
......
</classpath>

public static void loadJavaPrj(String prjPath){
??????
}

问号的地方我该怎么写呢?
展开
 我来答
jamxval
推荐于2017-09-30 · TA获得超过6821个赞
知道大有可为答主
回答量:4308
采纳率:82%
帮助的人:1371万
展开全部
直接写上 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怎么工作的)。
更多追问追答
追问
晕~,问题现在这个prj2是未知的,它可能是prj2,也可能是prj3,甚至还可能是用户自己临时写的一个prjX,所以说要动态加载。运行的时候,用户传哪个prj给我,我就加载哪个prj,程序才启动的时候,你怎么知道用户要传哪个prj给你,而把它事先写在classpath参数列表中?我知道应该通过ClassLoader来加载,但具体怎么弄我就不知道了
追答
那就写个自定义的 ClassLoader,它有个 URL[] 参数,这个你可以计算好再创建这个 ClassLoader(parent classloader 值是当前的 Thread.currentThread().getContextClassLoader()),并且把它 Thread.currentThread().setContextClassLoader() 替换当前的。

你需要用的动态加载的东西应该实现了某个共同的 Interface,而这个 interface 不能是动态的,必须在原来的默认的加载器中已经有的。

InterfaceA worker = Thread.currentThread().getConextClassLoader().load("XXXX").newInterface();
worker.doIt();

简单的情况下,可能只需要反射就可以了而不是需要自定义的 class loader。自定义的 classloader 是需要在“某个点”切入到“另一个上下文”中。在切入的过程中的反射和类加载器起作用,之后在“另一个上下文”内部就是普通的 new XXX() 这种方式了。比如:Tomcat 要运行我们的程序就是这个原理。在第一步时它需要创建 context,这个过程是自定义的加载器和反射同时用到。而我们的程序起来之后里面的代码从来没有使用反射和加载器的,都是 new CCC().doIt() 这种原始的操作。

你需要像这个“切入”到另一个上下文么?
匿名用户
2013-07-23
展开全部
运行时,和.classpath 无关。

运行时引入别的.jar,看ClassLoader

ClassLoader
Class.getClassLoader()
Returns the class loader for the class.

这样并不是很好玩。如果原来没有一些类型的,都只能当Object。调用方法、属性什么的都使用反射
追问
不是引入别的jar,是引入别的java工程,而且引入的这个java工程是用户传过来的,也就是在程序运行前是未知的,所以必须动态加载。也就是下面的这个方法应该怎么写?
public static void loadJavaPrj(String prjPath){
//prjPath为用户传过来的java工程的路径,怎么把这个java工程加载到当前的虚拟机中呢?
}
追答
运行时,做不到。除非你修改eclipse,就可以在eclipse中做到。

脱离eclipse之后,就是引用另外的包、class,就是需要使用 ClassLoader 来调用
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友254adbf
2020-02-11
知道答主
回答量:1
采纳率:0%
帮助的人:632
展开全部
aspx里可以动态加载ascx,我就是这么做的,项目已经持续运行很久了,并衍生出其它的子项目,开发和运维都很方便
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式