Java - отражение для получения общего типа метода - PullRequest
3 голосов
/ 08 мая 2011

Я пытаюсь создать служебный контейнер и хочу знать, как отразить тип, используемый при вызове метода. Смотрите ниже:

public class ServiceContainer {

   HashMap<Type, Object> services;

   public ServiceContainer() {
      services = new HashMap<Type, Object>();
   }

   public <T> void addService(Type t, T object) {
      services.put(t, object);
   }
   public <T> void addService(T object) {
      Type type = typeof(T);
      services.put(type, object);
   }
}

Я бы предпочел использовать второй addService, но если это невозможно, к этому можно прибегнуть.

РЕДАКТИРОВАТЬ: Я думаю, что я нашел решение для addService, но теперь есть еще один метод, который не может быть решен таким же образом:

public class ServiceContainer {
   HashMap<Class, Object> services;

   public ServiceContainer() {
      services = new HashMap<Class, Object>();
   }

   public <T> void addObject(T object) {
      Class type = object.getClass();
      services.put(type, object);
   }
   public <T> boolean containsService() {
   }
   public <T> T getService() {
      services.get(
         ServiceContainer.class.getMethod( "getService", null )
            .getGenericParameterTypes()[0] );
   }
}

Я сейчас как бы стреляю в темноте, мне нужно освежить документацию ...

1 Ответ

5 голосов
/ 08 мая 2011

Второй addService невозможен, если вы не сопоставляете имя класса (вместо Type) - например,

public class ServiceContainer {
 HashMap<Class, Object> services;

 public ServiceContainer() {
     services = new HashMap<Class, Object>();
 }

 public <T> void addService(Class<T>, T object) {
     services.put(t, object);
 }
 public <T> void addService(T object) {
     Class type = object.getClass();
     services.put(type, object);
 }
}

причина, по которой typeOfT () не работает, в том, что обобщенные java «стираются» после компиляции. Это действительно только «синтаксический сахар», который использует ocmpiler для проверки явных ошибок в присваиваниях типов.

изменить: так как вопрос изменился: для реализации метода containsService:

public boolean containsService(String classname) {
   return services.get(Class.forName(classname)) != null;
}

Я бы сказал, учитывая то, что вы делаете довольно часто, посмотрите, как вы можете использовать библиотеку внедрения зависимостей для выполнения регистрации и поиска ваших сервисов. Я слышал хорошие новости о Spring и Google Guice .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...