动态加载预编译的类而不进行反射

时间:2015-02-11 09:45:54

标签: java reflection classloader

在我的特定情况下,我想在运行时加载一个类,其中:我在编译时有类(及其定义),但我只找到其包含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的运行时路径存储在'location'下,我可以创建一个加载它的类加载器:

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", ...);

如果没有反思,这确实可行吗?我可以兑现在编译时了解课程的好处吗?或者我必须使用上面的反射。

谢谢。

1 个答案:

答案 0 :(得分:1)

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