我想加载一个位于另一个项目中的类;遵循我的包,项目等的结构:
--ProjectA
--package myPackageA
--myClassA
--ProjectB
--package myPackageB
--myClassB
--myMethodB
在myMethodB中,我想从ProjectA加载类“myClassA”。 如果它在ProjectB中,我知道如何加载类,但我不知道如何用我当前的结构引用它。
到目前为止我唯一能做的就是:
Class<?> c = thread.currentThread().getContextClassLoader().loadClass("location_of_myClassA");
简而言之:我写的是什么,而不是“location_of_myClassA”?
答案 0 :(得分:4)
如果类加载器知道它们两者,那么只需就需要提供完全限定的类名:
...loadClass("myPackageA.myClassA")
ClassLoader.loadClass
不需要被赋予“位置” - 这是初始化的一部分(例如,指向特定的jar文件或一组jar文件)。 / p>
答案 1 :(得分:0)
对于Eclipse,
Right Click Project -> Build Path -> Configure Build Path -> Project References
选择您要参考的项目
对于Netbeans,
Right Click Project -> Properties -> Libraries -> Add Project(Compile Tab)
选择项目。
答案 2 :(得分:0)
只要所有.class文件都在您的类路径中(或类路径中的.jar文件中),您就不应该做任何事情,但是:
Class<?> c = Class.forName(classname);
当然这使用默认的系统类加载器(由jvm的“java.class.path”设置控制,即java可执行文件的“-cp”参数)。
除此之外,您可以使用上面的Context ClassLoader,或使用加载其他特定类的相同类加载器:
// within an instance method
Class<?> c = getClass().getClassLoader().loadClass(classname)
// within some other object (other than SomeClass), or a static method:
Class<?> c = SomeClass.class.getClassLoader().loadClass(classname);
在典型的命令行应用程序中,由于只有系统类加载器(除非应用程序明确替换类加载器),因此所有这三个基本上都是相同的。但是,在Web应用程序中,servlet容器通常提供自定义的类加载器,以便为每个Web应用程序保留单独的类路径,因此您要调用的是哪个(我不会在此处详细说明)。
如果调用其中一个对您不起作用,则意味着您尝试加载的类不在您的一个类路径条目中,并且问题可能是您的IDE设置(可能您没有添加项目项目b的类路径)或你的maven设置(你没有在项目b中定义对项目a的依赖)。
答案 3 :(得分:-1)
您始终可以尝试使用JARMaker来jarA并将其用作ProjectB中的库