【问题标题】:Dynamically Loading a pre-compiled class without reflection动态加载预编译的类而不进行反射
【发布时间】:2015-02-11 09:45:53
【问题描述】:

在我的特定情况下,我想在运行时加载一个类,其中:我在编译时拥有该类(及其定义),但我只找到其包含 jar 的 位置运行。与仅在运行时知道类的名称的经典类加载情况有些相反。

假设要加载的类是org/animals/Cat.class,它是animals.jar 中众多类中的一类。当我编译我的程序时,animals.jar 在我的编译时类路径中,因为我知道它在哪里,例如: javac -cp <path to>/animals.jar Something.java

我可以导入、引用并编译我的程序Something.java

import org.animals.Cat;

    ...
    Cat c = new Cat();
    c.makesound();

现在我将程序部署到生产系统,其中animals.jar 和其他库的位置仅在运行时才知道。如果我知道位置,我可以使用

java -cp <path to>/animals.jar Something

但我只在运行时发现它。我希望我可以使用 URLClassLoader 使其工作。假设传入的 jar 运行时路径存储在“位置”下,我可以创建一个加载它的类加载器:

URL url = new File(location + "/animals.jar").toURI().toURL();
URL[] urls = new URL[]{url};
URLClassLoader cLoader = new URLClassLoader(urls);

然后只需在我的程序中使用 Cat 编译,无需求助 去反思。例如,这是我试图避免的:

Class clazz = cLoader.loadClass("org.animals.Cat")
Object o = clazz.newInstance();
Method m = o.getClass().getMethod("makesound", ...);

这真的可以不用反思吗?我可以利用在编译时了解类的好处吗?或者我必须像上面那样使用反射。

谢谢。

【问题讨论】:

    标签: java reflection classloader


    【解决方案1】:

    如果您的Cat 类已知实现了一些Animal 接口,那么您可以执行Animal a = (Animal)o 并开始在a 上调用Animal 方法,而无需使用任何反射。

    【讨论】:

      猜你喜欢
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多