2013-09-05 39 views
0

我有以下類:如何獲取Java泛型的類對象?

public abstract class AbstractService<PersistenceClass extends IPersistence, 
    RequestClass, ResponseClass> { 

    public String processRequest(final String aRequestAsText) 
    { 
     [...] 

     final RequestClass request = mapper.readValue(aRequestAsText, 
      RequestClass); 

     [...] 
    } 

} 

mapper.readValue invokation通常作爲

mapper.readValue(aRequestAsText, Request.class) 

我如何可以編寫它來實現,如果類RequestClass是一個通用的?

更新1(2013年6月9日):此代碼似乎工作:

public class GenericTypeBindigsFinder implements IGenericTypeBindigsFinder { 

    @SuppressWarnings("rawtypes") 
    @Override 
    public List<Class> getGenericTypes(final Class aClass) { 
     final List<Class> result = new LinkedList<Class>(); 

     final ParameterizedType gen = (ParameterizedType) aClass.getGenericSuperclass(); 

     final Type [] types = gen.getActualTypeArguments(); 

     for (int i = 0; i < types.length; i++) { 
      if (types[i] instanceof Class) 
      { 
       final Class clazz = (Class)types[i]; 
       result.add(clazz); 
      } 
     } 

     return result; 
    } 

} 

你可以找到相應的單元測試here

+0

你想要從一個泛型聲明類型參數? – Mauren

+0

不,我想要得到'RequestClass'類的對象(某種'RequestClass.class')。 –

+0

@DmitriPisarenko:請勿將反引號用於非代碼,請參閱[here why(http://meta.gaming.stackexchange.com/q/7437/88) –

回答

1

所以你想訪問在AbstractService中綁定的泛型類型。你可以通過反思來完成。看到這裏的示例代碼:

import java.lang.reflect.ParameterizedType; 
import java.lang.reflect.Type; 
import java.lang.reflect.TypeVariable; 

public class GenericClass extends GenericSuper<String, Integer> { 
    public GenericClass() { 
    ParameterizedType gen = (ParameterizedType) getClass().getGenericSuperclass(); 
    TypeVariable<?> typeVars[] = getClass().getSuperclass().getTypeParameters(); 
    Type [] types = gen.getActualTypeArguments(); 
    for (int i = 0; i < typeVars.length; i++) { 
     System.out.println("Generic parameter " + typeVars[i] + 
         " is bound to " + types[i]); 
    } 
    } 

    public static void main(String[] args) { 
    new GenericClass(); 
    } 
} 

class GenericSuper<X, Y> {}; 

輸出是:

Generic parameter X is bound to class java.lang.String 
Generic parameter Y is bound to class java.lang.Integer 

你可以施放types[i]上課。

有關更復雜的解決方案,請參見getTypeArguments(...)

+0

謝謝!我不得不修改你的代碼 - 看看我的更新1。 –

2

嘗試通過objectinterface優選方法,然後您可以使用getClass()方法或instanceof可以得到它的類。

+0

我需要* RequestClass *類來創建它的一個實例。所以我不能使用你的解決方案。基本上,這是JSON解析 - * mapper *接受一個文本並生成一個代表該文本的請求對象。爲了這樣做,它需要請求的類。 –

+1

這種情況下,您應該嘗試使用工廠模式創建所需的類。裸多態就足夠了,不需要泛型。這裏有一篇小文章(但你可以找到很多其他資源):http://java.dzone.com/articles/factory-design-pattern – ragatskynet

0

你可以看看這個TypeTools

Class<?>[] typeParams = TypeResolver.resolveRawArguments(AbstractService.class, getClass()); 
Class<PersistenceClass> persistenceClass = (Class<PersistenceClass>)typeParams[0]; 
Class<RequestClass> requestClass = (Class<RequestClass>)typeParams[1]; 
Class<ResponseClass> responseClass = (Class<ResponseClass>)typeParams[2];