一个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){
??????
}
问号的地方我该怎么写呢? 展开
<classpath>
......
<classpathentry combineaccessrules="false" kind="src" path="/JavaProjectXXX"/>
......
</classpath>
public static void loadJavaPrj(String prjPath){
??????
}
问号的地方我该怎么写呢? 展开
3个回答
展开全部
直接写上 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怎么工作的)。
我是假设 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,看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 来调用
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
aspx里可以动态加载ascx,我就是这么做的,项目已经持续运行很久了,并衍生出其它的子项目,开发和运维都很方便
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |