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

标签 java generics dynamic-class-creation

假设我正在创建一个名为 Government 的类。政府有官员、部长、部门等成员。我为这些成员中的每一个创建了一个界面,任何特定的政府都可以根据需要定义它们。

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

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

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

从纯粹的性能角度来看 - 哪个更好,为什么?我主要担心的是:

a) 做 forName()每次都执行昂贵的搜索?假设有一个非常大的类。

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

最佳答案

只要您重用您的政府对象,在运行时就没有区别。区别仅在于对象创建时。

1 和 2 在概念上有所不同 - 1 是硬连线的,而 2 是动态的(你甚至可以使用 DI 约束器,如 spring、guice 或 pico - 基本上你建议自己编写)

至于 forName() 性能 - 它取决于类加载器(以及容器)。他们中的大多数会缓存名称解析结果,在 map 中查找 - 但我不能代表所有

至于优化 - 有编译器优化,还有来自 JIT 编译器的积极的运行时优化 - 它们更重要。

关于java 泛型与使用 Class.forName() 动态加载类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8520651/

相关文章:

c# - 如何将通用 List<T> 转换为 List?

swift - 具有通用参数类型的协议(protocol)

java - 不明确的方法调用 println char 数组和 String(而不是 Object)

c# - 如何动态创建一个类?

java - 父类(super class)不能分配给运行时由 asm 实现的类

java - 如何测试 .class 文件是否已创建?

java - 使用 jsoup 解析 HTML 数据

使用/操作 Sharepoint 2013 Rest OData XML 结果的 Java 库

java - Android 免费应用程序中的复制保护

java - 大型 Excel 工作表生成优化