java - 如何根据注释值动态创建类的实例?
问题描述
我有一堆实现接口Job的类。这些类中的每一个都有一个注释 @Work(name="相应的名称")
这些类中的每一个都有不同的私有字段,这些私有字段在构造过程中使用 guice 注入。现在我想创建一个映射映射,读取一个类似这样的配置文件
- name: "test1"
worker_annotation = "annotation1"
- name: "test2"
worker_annotation = "annotation2"
- name: "test3"
worker_annotation = "annotation3"
所以这个模块需要做的是读取这个配置文件,获取所有带有@Work注解的类,并创建一个map Map,其中key字符串对应于配置文件中的名称,Job是实现Job接口的对应类并使用相应的 Worker 注释进行注释。
解决方案
我要提供的解决方案有一个限制,即它仅在您的所有工作类别都属于不同类型(= 类别)的情况下才有效,并且我认为就我可以从您的描述中假设的情况而言是这种情况。否则,您将需要引入键,以便 Guice 可以区分相同的类型。
您的示例听起来像是Guice扩展的MapBinder的工作。multibindings
我可以想到类似以下代码(未经测试):
// code in some Guice module configure() method
...
SomeConfig config = loadConfig(); // I invented this config code. Adapt!
...
MapBinder<String, Job> mapbinder
= MapBinder.newMapBinder(binder(), String.class, Job.class);
for(String name : config.allNames()) {
String workerName = config.lookUpWorkerName(name); // not Guice-related
Class<?> clazz = lookUpJobClassFromAnnotationName(workerName); // not Guice-related either
mapbinder.addBinding(name).to(clazz); // name must be unique
}
然后在其他一些类中,您可以注入Map<String, Job>
它,它为每个键包含相应的类实例。
关于 Guice 和配置的进一步阅读
我有一个类似的用例,尽管实例化依赖关系图更复杂,这取决于配置。如果您有兴趣并将我的用例与您的用例进行比较,我将其总结在一个文档中。
推荐阅读
- javascript - 悬停时显示随机图像
- python - Python 简单代码我无法修复 help1!1
- typescript - 如何在纯 javascript 中访问 typescript 模块?
- kubernetes - 如何使用 Traefik 和 Kubernetes 启用客户端证书身份验证?
- laravel - 如何在 Laravel::Storage 中使用带有自定义 cname 的“temporaryUrl”和 Amazon S3 -> CloudFront 并使用 Cname
- sql-server - 操作存储过程中的数据列表以在另一个存储过程中使用
- .net - 将 ComboBox SelectedValue 绑定到 Nullable(Of Integer) 属性会引发 InvalidCastException
- python - python install pip 出现错误“ModuleNotFoundError: No module named '_struct'”
- css - 如何选择前面没有另一个特定元素的元素?
- angular - “HubConnection”类的构造函数是私有的,只能在类声明中访问