SHORT ANSWER: для привязки к объекту Object bind() должен быть предоставлен параметр Class < Object>. Это говорит:Guice - Как связать тип, определенный во время выполнения программы?
Class<?> type = got_a_type(); Object object = got_an_object();
// Illegal - compilation error because of type check comparing ? to Object
bind(type).toInstance(object);
// Legal and working
bind((Class<Object>)type).toInstance(object);
LONG STORY:
У меня конфигурационные файлы в формате JSON из старой системы в следующем формате:
{
"$type": "test_config.DummyParams",
"$object": {
"stringParam": "This is a string",
"integerParam": 1234,
"booleanParam": false
}
}
В test_config.DummyParams класс доступен во время программы времени выполнения и выглядит так:
package test_config;
public class DummyParams {
public String stringParam;
public int integerParam;
public boolean booleanParam;
}
«S некоторый класс, который я хочу быть создан Guice, который оказывает параметр конструктора (необходимо вводить) типа DummyParams:
@Inject
public class DummyService(DummyParams params) { ... }
Теперь, так как DummyParams класса является то, если только во время выполнения (через JSon конфигурационный файл) и не может быть известно во время компиляции я не могу использовать этот тип в Guice привязках:
// Can't do this because DummyParams type should come from config file
Object object = ...; // Getting object somehow
bind(DummyParams.class).toInstance((DummyParams)object);
у меня есть некоторый старый код, который дает мне пары классов и объектов (типа и экземпляр), считанным из все файлы конфигурации json:
class ConfigObject {
Class<?> type;
Object instance;
}
Я попытался просто связать их:
ConfigObject obj = config.read(); // Getting pairs from config files walker
bind(obj.type).toInstance(obj.instance);
Но это не компилируется: «Java: toInstance (захват # 189?) В com.google.inject.binder.LinkedBindingBuilder не может быть применен к (java.lang.Object)».
Итак, вот вопрос: как связать экземпляр типа, который определяется во время выполнения? Я нарушаю концепции IoC и стараюсь делать то, что я пытаюсь сделать?