2013-08-16 103 views
0

我正在編寫一個util來爲使用Apache Velocity的類生成接口。目前,它使用以下DTOS:代碼生成:爲類創建接口

public class ClassDescriptor { 
    private String name; 
    private List<MethodDescriptor> methods; 
    // getters/setters 
} 

public class MethodDescriptor { 
    private String name; 
    private String returnType; 
    private List<ParamDescriptor> parameters; 
    // getters/setters 
} 

public class ParamDescriptor { 
    public String name; 
    public String type; 
    public List<String> generics; 
    // getters/setters 
} 

這裏是目前使用的代碼:

final Class<?> clazz; 
final ClassDescriptor classDescriptor = new ClassDescriptor(); 
final List<MethodDescriptor> methodDescriptors = new ArrayList<MethodDescriptor>(); 
for (Method method : clazz.getDeclaredMethods()) { 
    final MethodDescriptor methodDescriptor = new MethodDescriptor(); 
    final Paranamer paranamer = new AdaptiveParanamer(); 
    final String[] parameterNames = paranamer.lookupParameterNames(method, false); 
    final List<ParamDescriptor> paramDescriptors = new ArrayList<ParamDescriptor>(); 

    for (int i = 0; i < method.getParameterTypes().length; i++) { 
    final ParamDescriptor paramDescriptor = new ParamDescriptor(); 
    paramDescriptor.setName(parameterNames[i]); 
    paramDescriptors.add(paramDescriptor); 
    paramDescriptor.setType(method.getGenericParameterTypes()[i].toString().replace("class ", "")); 
    } 
    methodDescriptor.setParameters(paramDescriptors); 
    methodDescriptor.setName(method.getName()); 

    methodDescriptor.setReturnType(method.getGenericReturnType().toString()); 
    methodDescriptors.add(methodDescriptor); 
} 
classDescriptor.setMethods(methodDescriptors); 
classDescriptor.setName(simpleName); 

的?????應該包含代碼來獲取參數的泛型列表,這是問題,我仍然無法找到一種方法來做到這一點。我正在使用以下測試課程:

public class TestDto { 
    public void test(Map<Double, Integer> test) { 
    } 
} 

我該如何獲取此信息?我已經試過ParameterizedType沒有運氣。

更新:上面的代碼現在正在工作。

回答

1
Class<TestDto> klazz = TestDto.class; 
    try { 
     Method method = klazz.getDeclaredMethod("test", Map.class); 
     Type type = method.getGenericParameterTypes()[0]; 
     System.out.println("Type: " + type); 
    } catch (NoSuchMethodException ex) { 
     Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (SecurityException ex) { 
     Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    Type: java.util.Map<java.lang.Double, java.lang.Integer> 

由於類型擦除,這仍然是慷慨的信息。沒有聽到任何推向運行時泛型類型的使用。

+0

非常好!對我來說,主要的問題是讓泛型類將它們添加到導入列表中。我忘記了我們可以使用像java.util.blablabla這樣的完整路徑。此外,簡單的類有一個小問題,因爲它返回「java.util.String類」。目前我正在使用'paramDescriptor.setType(method.getGenericParameterTypes()[i] .toString()。replace(「class」,「」))''。不是很優雅,但很有效。我必須檢查這是否適合返回類型,之後,我會解答答案。 –