java泛型vs使用Class.forName()动态加载类

时间:2011-12-15 13:12:46

标签: java generics dynamic-class-creation

假设我正在创建一个名为Government的课程。政府有会员,如官员,部长,部门等。对于每个成员,我都会创建一个界面,任何特定的政府都会根据自己的喜好对其进行定义。

政府类中的主要方法称为Serve(Request req)。假设查询率非常大(每秒1000次查询)。

为了建立政府,我可以:
1)使用Java泛型来编写Government<Class Minister, Class Officer, ...>,并且任何特定的政府实现都需要在java代码中创建自己的Government对象,并使用main()来部署jar。

2)有一个配置文件,指定官员,部长等的类名,每当调用Serve()时,它使用Class.forName()Class.newInstance()创建一个对象类。任何新政府只需要为其成员和配置文件编写类。所有政府都有一个main()

从纯粹的表现来看 - 这更好,为什么?我主要担心的是:

a)forName()每次执行代价高昂的搜索吗?假设有很大的类。

b)我们是否错过了可能在案例1中执行的编译器优化,但在动态类的情况2中却没有?

3 个答案:

答案 0 :(得分:2)

只要重用您的管理对象,运行时就没有区别。差异仅在对象创建时。

1&amp; 2概念不同 - 1是硬连线,2是动态的(你甚至可以使用像春天,guice或pico这样的DI对手 - 基本上你建议你自己编写)

至于forName()性能 - 它在classloader上(也在容器上)。他们的MOst会缓存名称解析结果,在地图中查找 - 但我不能代表所有

至于优化 - 有编译器优化,以及来自JIT编译器的激进的运行时优化 - 它们更重要。

答案 1 :(得分:0)

我不明白。这两个不是替代品;它们非常正交:泛型是一个编译时构造。它被擦除,并且在运行时不会转换为任何内容。另一方面,通过调用forName来加载类是运行时的事情。一个不影响另一个。

如果您使用泛型,那么这意味着您在运行时不需要类对象,因为在泛型中您无权访问类对象,除非您明确地传递它。如果您在运行时不需要类对象,则表示您不需要使用forName加载它,因此与forName不一致。如果你明确地传递了类对象,那么这意味着你已经拥有了类对象而不需要加载它,也与forName不一致。

答案 2 :(得分:0)

你的描述对我来说是这样的:“我想使用依赖注入,我应该自己动手吗?”

关注Spring(或Google的Guice)。我会假设春天。

为stuff创建接口并配置在Spring中为每个实现使用的实现。