繁体   English   中英

Java - 获取Method的泛型类型的反射

[英]Java - Reflection to get Method's Generic Type

我正在尝试创建一个服务容器,并想知道如何反映调用该方法时使用的类型。 见下文:

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] );
   }
}

我现在有点在黑暗中射击,我应该去看一些文件......

除非您映射类名(而不是Type ),否则第二个addService是不可能的 - 例如

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泛型在编译后被“擦除”。 实际上只有'语法糖'才能用于检查类型赋值中明显错误的八卦者。

编辑:自问题发生变化:实现containsService方法:

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

我会说,鉴于您正在做的事情非常普遍,请了解如何使用依赖注入库来执行服务注册和检索。 我听说有关Spring的好消息,还有google Guice

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM