2017-09-04 50 views
0

我一直在使用下面的代码来加载我知道要加载的包的类。加载预先未知包的Java类

ClassLoader classLoader = ClassLoader.getSystemClassLoader(); 

Class<?> myClass = classLoader.loadClass(classNameToBeLoaded); 

现在文件夹/包结构发生变化。

变量classNameToBeLoaded可以来自我无法预先知道的任何包,因为类名来自用户提供的Excel工作表。

例如,classNameToBeLoaded的值可以是从Excel文件中读取的“Utils”,“FileValidation”等。

这个类可以来自不同的包,比如“com.iyaffle.utils”或像“com.testing.validation”或类似的东西。

当我们不知道包名时,如何让类自动加载?

其他类似的线程不具有具体的答案:

+2

你不能。让用户提供包名称。 – EJP

+0

@EJP:\t 将只有几个软件包将被使用,它没有名称相同的方法。 – Purus

+0

为什么不只是为一个包调用'loadClass',并且如果调用失败,则调用另一个包? – DodgyCodeException

回答

1

你需要知道的完全限定名来加载类,有很多类,具有相同类名称,唯一使它们保持不同的是包名称。

一个很好的例子是:

  • java.awt.List中
  • 的java.util.List

如果类没有共同的方法,你需要给你打电话可以只需像现在这样加载它们,但是要添加包名称。

调用常用方法的最安全方法是拥有一个静态接口或抽象类,以便您的所有动态类都可以扩展,以便您可以将动态加载的类实例视为实现常用方法的实例。

+0

只有几个将被使用的软件包,它没有名称相同的方法。 – Purus

+1

你可以有一个从简短的类名到完整的类名的映射,这也有助于减少攻击面,因为它会阻止攻击者加载任意类,可能运行任意代码 – jrtapsell